Fixes and song fixes
3
.vscode/settings.json
vendored
@ -1,6 +1,7 @@
|
||||
{
|
||||
"Lua.diagnostics.disable": [
|
||||
"different-requires",
|
||||
"need-check-nil"
|
||||
"need-check-nil",
|
||||
"cast-local-type"
|
||||
]
|
||||
}
|
@ -1,97 +0,0 @@
|
||||
-- RANK ONLY UP TILL 20, 0 MINIMUM, CHANGE THIS TO SUGGEST HOW HARD THE SONG IS, BY MARKEDAMAN
|
||||
|
||||
function onCreate()
|
||||
if difficulty == 0 then -- easy
|
||||
rank = 0
|
||||
elseif difficulty == 1 then -- normal
|
||||
rank = 1
|
||||
elseif difficulty == 2 then -- hard
|
||||
rank = 1
|
||||
elseif difficulty == 3 then -- erect
|
||||
rank = 8
|
||||
elseif difficulty == 4 then -- nightmare
|
||||
rank = 9
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
function onCreatePost()
|
||||
if not hideHud then
|
||||
if rank > 10 then
|
||||
makeLuaSprite('star', 'star2', 1070, 590)
|
||||
makeAnimatedLuaSprite('starFlame', 'starFlame', 1030, 440)
|
||||
addAnimationByPrefix('starFlame', 'starFlame', 'fire loop full instance', 24, true)
|
||||
setProperty('starFlame.alpha', 0)
|
||||
scaleObject('starFlame', 1.5, 1.5)
|
||||
setObjectCamera('starFlame', 'hud')
|
||||
addLuaSprite('starFlame', true)
|
||||
elseif rank <= 10 then
|
||||
makeLuaSprite('star', 'star1', 1070, 590)
|
||||
end
|
||||
|
||||
scaleObject('star', 0.9, 0.9)
|
||||
setObjectCamera('star', 'hud')
|
||||
setObjectOrder('star', getObjectOrder('starFlame') + 1)
|
||||
setProperty('star.alpha', 0)
|
||||
addLuaSprite('star')
|
||||
|
||||
makeLuaText('difficulty', ''.. rank ..'', 2230 , 0, 620)
|
||||
setTextSize('difficulty', 37)
|
||||
setTextFont('difficulty', 'combo.ttf')
|
||||
setProperty('difficulty.alpha', 0)
|
||||
addLuaText('difficulty', false)
|
||||
setObjectOrder('difficulty', getObjectOrder('star') + 1)
|
||||
|
||||
if downscroll then
|
||||
setProperty('difficulty.y', 70)
|
||||
setProperty('star.y', 40)
|
||||
setProperty('starFlame.y', -5)
|
||||
setProperty('starFlame.angle', 190)
|
||||
end
|
||||
|
||||
|
||||
|
||||
if rank > 10 then
|
||||
setTextColor('difficulty', 'ffffff')
|
||||
setTextBorder('difficulty', 2, '00AEFF')
|
||||
elseif rank <= 10 then
|
||||
setTextColor('difficulty', '000000')
|
||||
setTextBorder('difficulty', 3, 'FFFFFF')
|
||||
end
|
||||
|
||||
|
||||
runTimer('ready', 0.5) -- star fade in
|
||||
runTimer('wait', 8) -- star fade out
|
||||
runTimer('wait2', 7.5) -- difficulty fade out
|
||||
|
||||
if rank > 10 then
|
||||
runTimer('pausefire', 2) -- difficulty fade in
|
||||
elseif rank <=10 then
|
||||
runTimer('pause', 2)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function onTimerCompleted(tag)
|
||||
if not hideHud then
|
||||
if tag == 'ready' then
|
||||
doTweenAlpha('hi', 'star', 1, 0.5,'linear')
|
||||
end
|
||||
if tag == 'wait' then
|
||||
doTweenAlpha('gone', 'star', 0, 0.5,'linear')
|
||||
doTweenAlpha('fireout', 'starFlame', 0, 0.5,'linear')
|
||||
end
|
||||
if tag == 'wait2' then
|
||||
doTweenAlpha('bye', 'difficulty', 0, 0.5,'linear')
|
||||
end
|
||||
if tag == 'pause' then
|
||||
doTweenAlpha('hi2', 'difficulty', 1, 0.5,'linear')
|
||||
end
|
||||
if tag == 'pausefire' then
|
||||
setProperty('difficulty.alpha', 1)
|
||||
setProperty('starFlame.alpha', 1)
|
||||
playSound('light', 0.7)
|
||||
end
|
||||
end
|
||||
end
|
@ -1 +0,0 @@
|
||||
{"song":{"song":"Bopeebo","bpm":100.0,"needsVoices":true,"player1":"bf","player2":"dad","speed":1.3,"notes":[{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[0.0,2,0.0],[600.0,3,600.0],[1200.0,3,600.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[2400.0,2,0.0],[3000.0,3,600.0],[3600.0,3,600.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[4800.0,1,300.0],[5400.0,0,300.0],[6000.0,3,600.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[7200.0,1,300.0],[7800.0,0,300.0],[8400.0,3,600.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[9600.0,1,300.0],[10200.0,3,0.0],[10500.0,0,0.0],[10800.0,1,600.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[12000.0,1,300.0],[12600.0,3,0.0],[12900.0,0,0.0],[13200.0,1,600.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[14400.0,3,0.0],[14700.0,1,0.0],[15300.0,0,0.0],[15600.0,2,600.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[16800.0,3,0.0],[17100.0,1,0.0],[17700.0,0,0.0],[18000.0,2,600.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[19200.0,0,0.0],[19500.0,3,0.0],[19800.0,1,900.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[21600.0,0,0.0],[21900.0,3,0.0],[22200.0,1,900.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[24000.0,1,0.0],[24300.0,3,0.0],[24600.0,0,900.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[26400.0,1,0.0],[26700.0,3,0.0],[27000.0,0,900.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[28800.0,2,0.0],[29100.0,3,0.0],[29400.0,0,1200.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[31200.0,2,0.0],[31500.0,3,0.0],[31800.0,0,1200.0],[33300.0,6,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[33600.0,0,0.0],[33900.0,3,0.0],[34500.0,2,0.0],[34575.0,0,0.0],[34800.0,1,600.0],[35700.0,6,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[36000.0,0,0.0],[36300.0,3,0.0],[36900.0,2,0.0],[36975.0,0,0.0],[37200.0,1,600.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[38400.0,2,450.0],[39000.0,3,300.0],[39600.0,0,600.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[40800.0,2,450.0],[41400.0,3,300.0],[42000.0,0,600.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[43200.0,1,0.0],[43800.0,2,0.0],[44400.0,1,0.0],[44550.0,1,0.0],[44700.0,1,0.0],[45000.0,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[45600.0,1,0.0],[46200.0,2,0.0],[46800.0,1,0.0],[46950.0,1,0.0],[47100.0,1,0.0],[47400.0,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[48000.0,2,450.0],[48600.0,3,300.0],[49200.0,0,450.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[50400.0,2,450.0],[51000.0,3,300.0],[51600.0,0,450.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[52800.0,3,1800.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[55200.0,3,1800.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[57600.0,2,0.0],[57900.0,3,0.0],[58200.0,0,1200.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[60000.0,2,0.0],[60300.0,3,0.0],[60600.0,0,1200.0],[62100.0,6,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[62400.0,0,0.0],[62700.0,3,0.0],[63300.0,2,0.0],[63375.0,0,0.0],[63600.0,1,600.0],[64500.0,6,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[64800.0,0,0.0],[65100.0,3,0.0],[65700.0,2,0.0],[65775.0,0,0.0],[66000.0,1,600.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[67200.0,2,0.0],[67500.0,3,0.0],[67800.0,0,0.0],[68100.0,2,0.0],[68400.0,1,600.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[69600.0,2,0.0],[69900.0,3,0.0],[70200.0,0,0.0],[70500.0,2,0.0],[70800.0,1,600.0],[71700.0,6,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[72000.0,0,0.0],[72300.0,3,0.0],[72900.0,2,0.0],[72975.0,0,0.0],[73200.0,1,600.0],[74100.0,6,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[74400.0,0,0.0],[74700.0,3,0.0],[75300.0,2,0.0],[75375.0,0,0.0],[75600.0,1,600.0]]}]},"generatedBy":"SNIFF ver.6"}
|
@ -3824,7 +3824,7 @@
|
||||
"needsVoices": true,
|
||||
"arrowSkin": "",
|
||||
"validScore": true,
|
||||
"stage": "stage",
|
||||
"stage": "stageErect",
|
||||
"bpm": 123,
|
||||
"speed": 2.3
|
||||
}
|
||||
|
@ -1,850 +0,0 @@
|
||||
{
|
||||
"song": {
|
||||
"player1": "bf",
|
||||
"player2": "dad",
|
||||
"notes": [
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [
|
||||
[
|
||||
0,
|
||||
2,
|
||||
0
|
||||
],
|
||||
[
|
||||
600,
|
||||
3,
|
||||
600
|
||||
],
|
||||
[
|
||||
1200,
|
||||
3,
|
||||
525
|
||||
]
|
||||
],
|
||||
"mustHitSection": false
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [
|
||||
[
|
||||
2400,
|
||||
2,
|
||||
0
|
||||
],
|
||||
[
|
||||
3000,
|
||||
3,
|
||||
600
|
||||
],
|
||||
[
|
||||
3600,
|
||||
3,
|
||||
525
|
||||
]
|
||||
],
|
||||
"mustHitSection": true
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [
|
||||
[
|
||||
4800,
|
||||
1,
|
||||
300
|
||||
],
|
||||
[
|
||||
5400,
|
||||
0,
|
||||
300
|
||||
],
|
||||
[
|
||||
6000,
|
||||
3,
|
||||
525
|
||||
]
|
||||
],
|
||||
"mustHitSection": false
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [
|
||||
[
|
||||
7200,
|
||||
1,
|
||||
300
|
||||
],
|
||||
[
|
||||
7800,
|
||||
0,
|
||||
300
|
||||
],
|
||||
[
|
||||
8400,
|
||||
3,
|
||||
525
|
||||
]
|
||||
],
|
||||
"mustHitSection": true
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [
|
||||
[
|
||||
9600,
|
||||
1,
|
||||
300
|
||||
],
|
||||
[
|
||||
10200,
|
||||
3,
|
||||
0
|
||||
],
|
||||
[
|
||||
10500,
|
||||
0,
|
||||
0
|
||||
],
|
||||
[
|
||||
10800,
|
||||
1,
|
||||
525
|
||||
]
|
||||
],
|
||||
"mustHitSection": false
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [
|
||||
[
|
||||
12000,
|
||||
1,
|
||||
300
|
||||
],
|
||||
[
|
||||
12600,
|
||||
3,
|
||||
0
|
||||
],
|
||||
[
|
||||
12900,
|
||||
0,
|
||||
0
|
||||
],
|
||||
[
|
||||
13200,
|
||||
1,
|
||||
525
|
||||
]
|
||||
],
|
||||
"mustHitSection": true
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [
|
||||
[
|
||||
14400,
|
||||
3,
|
||||
0
|
||||
],
|
||||
[
|
||||
14700,
|
||||
1,
|
||||
0
|
||||
],
|
||||
[
|
||||
15300,
|
||||
0,
|
||||
0
|
||||
],
|
||||
[
|
||||
15600,
|
||||
2,
|
||||
525
|
||||
]
|
||||
],
|
||||
"mustHitSection": false
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [
|
||||
[
|
||||
16800,
|
||||
3,
|
||||
0
|
||||
],
|
||||
[
|
||||
17100,
|
||||
1,
|
||||
0
|
||||
],
|
||||
[
|
||||
17700,
|
||||
0,
|
||||
0
|
||||
],
|
||||
[
|
||||
18000,
|
||||
2,
|
||||
525
|
||||
]
|
||||
],
|
||||
"mustHitSection": true
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [
|
||||
[
|
||||
19200,
|
||||
0,
|
||||
0
|
||||
],
|
||||
[
|
||||
19500,
|
||||
3,
|
||||
0
|
||||
],
|
||||
[
|
||||
19800,
|
||||
1,
|
||||
900
|
||||
]
|
||||
],
|
||||
"mustHitSection": false
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [
|
||||
[
|
||||
21600,
|
||||
0,
|
||||
0
|
||||
],
|
||||
[
|
||||
21900,
|
||||
3,
|
||||
0
|
||||
],
|
||||
[
|
||||
22200,
|
||||
1,
|
||||
900
|
||||
]
|
||||
],
|
||||
"mustHitSection": true
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [
|
||||
[
|
||||
24000,
|
||||
1,
|
||||
0
|
||||
],
|
||||
[
|
||||
24300,
|
||||
3,
|
||||
0
|
||||
],
|
||||
[
|
||||
24600,
|
||||
0,
|
||||
900
|
||||
]
|
||||
],
|
||||
"mustHitSection": false
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [
|
||||
[
|
||||
26400,
|
||||
1,
|
||||
0
|
||||
],
|
||||
[
|
||||
26700,
|
||||
3,
|
||||
0
|
||||
],
|
||||
[
|
||||
27000,
|
||||
0,
|
||||
900
|
||||
]
|
||||
],
|
||||
"mustHitSection": true
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [
|
||||
[
|
||||
28800,
|
||||
2,
|
||||
0
|
||||
],
|
||||
[
|
||||
29100,
|
||||
3,
|
||||
0
|
||||
],
|
||||
[
|
||||
29400,
|
||||
0,
|
||||
1125
|
||||
]
|
||||
],
|
||||
"mustHitSection": false
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [
|
||||
[
|
||||
31200,
|
||||
2,
|
||||
0
|
||||
],
|
||||
[
|
||||
31500,
|
||||
3,
|
||||
0
|
||||
],
|
||||
[
|
||||
31800,
|
||||
0,
|
||||
1125
|
||||
],
|
||||
[
|
||||
33300,
|
||||
6,
|
||||
0
|
||||
]
|
||||
],
|
||||
"mustHitSection": true
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [
|
||||
[
|
||||
33600,
|
||||
0,
|
||||
0
|
||||
],
|
||||
[
|
||||
33900,
|
||||
3,
|
||||
0
|
||||
],
|
||||
[
|
||||
34500,
|
||||
2,
|
||||
0
|
||||
],
|
||||
[
|
||||
34800,
|
||||
1,
|
||||
525
|
||||
],
|
||||
[
|
||||
35700,
|
||||
6,
|
||||
0
|
||||
]
|
||||
],
|
||||
"mustHitSection": false
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [
|
||||
[
|
||||
36000,
|
||||
0,
|
||||
0
|
||||
],
|
||||
[
|
||||
36300,
|
||||
3,
|
||||
0
|
||||
],
|
||||
[
|
||||
36900,
|
||||
2,
|
||||
0
|
||||
],
|
||||
[
|
||||
37200,
|
||||
1,
|
||||
525
|
||||
]
|
||||
],
|
||||
"mustHitSection": true
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [
|
||||
[
|
||||
38400,
|
||||
2,
|
||||
450
|
||||
],
|
||||
[
|
||||
39000,
|
||||
3,
|
||||
300
|
||||
],
|
||||
[
|
||||
39600,
|
||||
0,
|
||||
525
|
||||
]
|
||||
],
|
||||
"mustHitSection": false
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [
|
||||
[
|
||||
40800,
|
||||
2,
|
||||
450
|
||||
],
|
||||
[
|
||||
41400,
|
||||
3,
|
||||
300
|
||||
],
|
||||
[
|
||||
42000,
|
||||
0,
|
||||
525
|
||||
]
|
||||
],
|
||||
"mustHitSection": true
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [
|
||||
[
|
||||
43200,
|
||||
1,
|
||||
0
|
||||
],
|
||||
[
|
||||
43800,
|
||||
2,
|
||||
0
|
||||
],
|
||||
[
|
||||
44400,
|
||||
1,
|
||||
0
|
||||
],
|
||||
[
|
||||
44550,
|
||||
1,
|
||||
0
|
||||
],
|
||||
[
|
||||
44700,
|
||||
1,
|
||||
0
|
||||
],
|
||||
[
|
||||
45000,
|
||||
2,
|
||||
0
|
||||
]
|
||||
],
|
||||
"mustHitSection": false
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [
|
||||
[
|
||||
45600,
|
||||
1,
|
||||
0
|
||||
],
|
||||
[
|
||||
46200,
|
||||
2,
|
||||
0
|
||||
],
|
||||
[
|
||||
46800,
|
||||
1,
|
||||
0
|
||||
],
|
||||
[
|
||||
46950,
|
||||
1,
|
||||
0
|
||||
],
|
||||
[
|
||||
47100,
|
||||
1,
|
||||
0
|
||||
],
|
||||
[
|
||||
47400,
|
||||
2,
|
||||
0
|
||||
]
|
||||
],
|
||||
"mustHitSection": true
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [
|
||||
[
|
||||
48000,
|
||||
2,
|
||||
450
|
||||
],
|
||||
[
|
||||
48600,
|
||||
3,
|
||||
300
|
||||
],
|
||||
[
|
||||
49200,
|
||||
0,
|
||||
375
|
||||
]
|
||||
],
|
||||
"mustHitSection": false
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [
|
||||
[
|
||||
50400,
|
||||
2,
|
||||
450
|
||||
],
|
||||
[
|
||||
51000,
|
||||
3,
|
||||
300
|
||||
],
|
||||
[
|
||||
51600,
|
||||
0,
|
||||
375
|
||||
]
|
||||
],
|
||||
"mustHitSection": true
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [
|
||||
[
|
||||
52800,
|
||||
3,
|
||||
1725
|
||||
]
|
||||
],
|
||||
"mustHitSection": false
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [
|
||||
[
|
||||
55200,
|
||||
3,
|
||||
1725
|
||||
]
|
||||
],
|
||||
"mustHitSection": true
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [
|
||||
[
|
||||
57600,
|
||||
2,
|
||||
0
|
||||
],
|
||||
[
|
||||
57900,
|
||||
3,
|
||||
0
|
||||
],
|
||||
[
|
||||
58200,
|
||||
0,
|
||||
1125
|
||||
]
|
||||
],
|
||||
"mustHitSection": false
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [
|
||||
[
|
||||
60000,
|
||||
2,
|
||||
0
|
||||
],
|
||||
[
|
||||
60300,
|
||||
3,
|
||||
0
|
||||
],
|
||||
[
|
||||
60600,
|
||||
0,
|
||||
1125
|
||||
],
|
||||
[
|
||||
62100,
|
||||
6,
|
||||
0
|
||||
]
|
||||
],
|
||||
"mustHitSection": true
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [
|
||||
[
|
||||
62400,
|
||||
0,
|
||||
0
|
||||
],
|
||||
[
|
||||
62700,
|
||||
3,
|
||||
0
|
||||
],
|
||||
[
|
||||
63300,
|
||||
2,
|
||||
0
|
||||
],
|
||||
[
|
||||
63600,
|
||||
1,
|
||||
525
|
||||
],
|
||||
[
|
||||
64500,
|
||||
6,
|
||||
0
|
||||
]
|
||||
],
|
||||
"mustHitSection": false
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [
|
||||
[
|
||||
64800,
|
||||
0,
|
||||
0
|
||||
],
|
||||
[
|
||||
65100,
|
||||
3,
|
||||
0
|
||||
],
|
||||
[
|
||||
65700,
|
||||
2,
|
||||
0
|
||||
],
|
||||
[
|
||||
66000,
|
||||
1,
|
||||
525
|
||||
]
|
||||
],
|
||||
"mustHitSection": true
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [
|
||||
[
|
||||
67200,
|
||||
2,
|
||||
0
|
||||
],
|
||||
[
|
||||
67500,
|
||||
3,
|
||||
0
|
||||
],
|
||||
[
|
||||
67800,
|
||||
0,
|
||||
0
|
||||
],
|
||||
[
|
||||
68100,
|
||||
2,
|
||||
0
|
||||
],
|
||||
[
|
||||
68400,
|
||||
1,
|
||||
525
|
||||
]
|
||||
],
|
||||
"mustHitSection": false
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [
|
||||
[
|
||||
69600,
|
||||
2,
|
||||
0
|
||||
],
|
||||
[
|
||||
69900,
|
||||
3,
|
||||
0
|
||||
],
|
||||
[
|
||||
70200,
|
||||
0,
|
||||
0
|
||||
],
|
||||
[
|
||||
70500,
|
||||
2,
|
||||
0
|
||||
],
|
||||
[
|
||||
70800,
|
||||
1,
|
||||
525
|
||||
],
|
||||
[
|
||||
71700,
|
||||
6,
|
||||
0
|
||||
]
|
||||
],
|
||||
"mustHitSection": true
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [
|
||||
[
|
||||
72000,
|
||||
0,
|
||||
0
|
||||
],
|
||||
[
|
||||
72300,
|
||||
3,
|
||||
0
|
||||
],
|
||||
[
|
||||
72900,
|
||||
2,
|
||||
0
|
||||
],
|
||||
[
|
||||
73200,
|
||||
1,
|
||||
525
|
||||
],
|
||||
[
|
||||
74100,
|
||||
6,
|
||||
0
|
||||
]
|
||||
],
|
||||
"mustHitSection": false
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [
|
||||
[
|
||||
74400,
|
||||
0,
|
||||
0
|
||||
],
|
||||
[
|
||||
74700,
|
||||
3,
|
||||
0
|
||||
],
|
||||
[
|
||||
75300,
|
||||
2,
|
||||
0
|
||||
],
|
||||
[
|
||||
75600,
|
||||
1,
|
||||
525
|
||||
]
|
||||
],
|
||||
"mustHitSection": true
|
||||
},
|
||||
{
|
||||
"sectionNotes": [],
|
||||
"typeOfSection": 0,
|
||||
"lengthInSteps": 16,
|
||||
"altAnim": false,
|
||||
"mustHitSection": true,
|
||||
"changeBPM": false,
|
||||
"bpm": 100
|
||||
},
|
||||
{
|
||||
"sectionNotes": [],
|
||||
"typeOfSection": 0,
|
||||
"lengthInSteps": 16,
|
||||
"altAnim": false,
|
||||
"mustHitSection": true,
|
||||
"changeBPM": false,
|
||||
"bpm": 100
|
||||
},
|
||||
{
|
||||
"sectionNotes": [],
|
||||
"typeOfSection": 0,
|
||||
"lengthInSteps": 16,
|
||||
"altAnim": false,
|
||||
"mustHitSection": true,
|
||||
"changeBPM": false,
|
||||
"bpm": 100
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"altAnim": false,
|
||||
"typeOfSection": 0,
|
||||
"sectionNotes": [],
|
||||
"bpm": 100,
|
||||
"changeBPM": false,
|
||||
"mustHitSection": true
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"altAnim": false,
|
||||
"typeOfSection": 0,
|
||||
"sectionNotes": [],
|
||||
"bpm": 100,
|
||||
"changeBPM": false,
|
||||
"mustHitSection": true
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"altAnim": false,
|
||||
"typeOfSection": 0,
|
||||
"sectionNotes": [],
|
||||
"bpm": 100,
|
||||
"changeBPM": false,
|
||||
"mustHitSection": true
|
||||
}
|
||||
],
|
||||
"player3": "gf",
|
||||
"song": "Bopeebo",
|
||||
"needsVoices": true,
|
||||
"validScore": true,
|
||||
"speed": 1,
|
||||
"bpm": 100
|
||||
}
|
||||
}
|
@ -1,4 +0,0 @@
|
||||
function onCreate()
|
||||
setTextFont('scoreTxt', 'vcr.ttf')
|
||||
setTextFont('timeTxt','timer.ttf')
|
||||
end
|
@ -1,346 +0,0 @@
|
||||
{
|
||||
"song": {
|
||||
"player1": "bf",
|
||||
"song": "Bopeebo",
|
||||
"player2": "dad",
|
||||
"notes": [
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [],
|
||||
"mustHitSection": false
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [
|
||||
[
|
||||
4290,
|
||||
-1,
|
||||
"Hey!",
|
||||
"0",
|
||||
""
|
||||
]
|
||||
],
|
||||
"mustHitSection": true
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [],
|
||||
"mustHitSection": false
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [
|
||||
[
|
||||
9090,
|
||||
-1,
|
||||
"Hey!",
|
||||
"0",
|
||||
""
|
||||
]
|
||||
],
|
||||
"mustHitSection": true
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [],
|
||||
"mustHitSection": false
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [
|
||||
[
|
||||
13890,
|
||||
-1,
|
||||
"Hey!",
|
||||
"0",
|
||||
""
|
||||
]
|
||||
],
|
||||
"mustHitSection": true
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [],
|
||||
"mustHitSection": false
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [
|
||||
[
|
||||
18690,
|
||||
-1,
|
||||
"Hey!",
|
||||
"0",
|
||||
""
|
||||
]
|
||||
],
|
||||
"mustHitSection": true
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [],
|
||||
"mustHitSection": false
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [
|
||||
[
|
||||
23490,
|
||||
-1,
|
||||
"Hey!",
|
||||
"0",
|
||||
""
|
||||
]
|
||||
],
|
||||
"mustHitSection": true
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [],
|
||||
"mustHitSection": false
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [
|
||||
[
|
||||
28290,
|
||||
-1,
|
||||
"Hey!",
|
||||
"0",
|
||||
""
|
||||
]
|
||||
],
|
||||
"mustHitSection": true
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [],
|
||||
"mustHitSection": false
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [
|
||||
[
|
||||
33090,
|
||||
-1,
|
||||
"Hey!",
|
||||
"0",
|
||||
""
|
||||
]
|
||||
],
|
||||
"mustHitSection": true
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [],
|
||||
"mustHitSection": false
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [
|
||||
[
|
||||
37890,
|
||||
-1,
|
||||
"Hey!",
|
||||
"0",
|
||||
""
|
||||
]
|
||||
],
|
||||
"mustHitSection": true
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [],
|
||||
"mustHitSection": false
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [
|
||||
[
|
||||
42690,
|
||||
-1,
|
||||
"Hey!",
|
||||
"0",
|
||||
""
|
||||
]
|
||||
],
|
||||
"mustHitSection": true
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [],
|
||||
"mustHitSection": false
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [
|
||||
[
|
||||
47490,
|
||||
-1,
|
||||
"Hey!",
|
||||
"0",
|
||||
""
|
||||
]
|
||||
],
|
||||
"mustHitSection": true
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [],
|
||||
"mustHitSection": false
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [
|
||||
[
|
||||
52290,
|
||||
-1,
|
||||
"Hey!",
|
||||
"0",
|
||||
""
|
||||
]
|
||||
],
|
||||
"mustHitSection": true
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [],
|
||||
"mustHitSection": false
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [
|
||||
[
|
||||
57090,
|
||||
-1,
|
||||
"Hey!",
|
||||
"0",
|
||||
""
|
||||
]
|
||||
],
|
||||
"mustHitSection": true
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [],
|
||||
"mustHitSection": false
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [
|
||||
[
|
||||
61890,
|
||||
-1,
|
||||
"Hey!",
|
||||
"0",
|
||||
""
|
||||
]
|
||||
],
|
||||
"mustHitSection": true
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [],
|
||||
"mustHitSection": false
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [
|
||||
[
|
||||
66690,
|
||||
-1,
|
||||
"Hey!",
|
||||
"0",
|
||||
""
|
||||
]
|
||||
],
|
||||
"mustHitSection": true
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [],
|
||||
"mustHitSection": false
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [
|
||||
[
|
||||
71490,
|
||||
-1,
|
||||
"Hey!",
|
||||
"0",
|
||||
""
|
||||
]
|
||||
],
|
||||
"mustHitSection": true
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [],
|
||||
"mustHitSection": false
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"sectionNotes": [
|
||||
[
|
||||
76290,
|
||||
-1,
|
||||
"Hey!",
|
||||
"0",
|
||||
""
|
||||
]
|
||||
],
|
||||
"mustHitSection": true
|
||||
},
|
||||
{
|
||||
"sectionNotes": [],
|
||||
"typeOfSection": 0,
|
||||
"lengthInSteps": 16,
|
||||
"altAnim": false,
|
||||
"mustHitSection": true,
|
||||
"changeBPM": false,
|
||||
"bpm": 100
|
||||
},
|
||||
{
|
||||
"sectionNotes": [],
|
||||
"typeOfSection": 0,
|
||||
"lengthInSteps": 16,
|
||||
"altAnim": false,
|
||||
"mustHitSection": true,
|
||||
"changeBPM": false,
|
||||
"bpm": 100
|
||||
},
|
||||
{
|
||||
"sectionNotes": [],
|
||||
"typeOfSection": 0,
|
||||
"lengthInSteps": 16,
|
||||
"altAnim": false,
|
||||
"mustHitSection": true,
|
||||
"changeBPM": false,
|
||||
"bpm": 100
|
||||
},
|
||||
{
|
||||
"sectionNotes": [],
|
||||
"typeOfSection": 0,
|
||||
"lengthInSteps": 16,
|
||||
"altAnim": false,
|
||||
"mustHitSection": true,
|
||||
"changeBPM": false,
|
||||
"bpm": 100
|
||||
},
|
||||
{
|
||||
"lengthInSteps": 16,
|
||||
"altAnim": false,
|
||||
"typeOfSection": 0,
|
||||
"sectionNotes": [],
|
||||
"bpm": 100,
|
||||
"changeBPM": false,
|
||||
"mustHitSection": true
|
||||
}
|
||||
],
|
||||
"needsVoices": true,
|
||||
"validScore": true,
|
||||
"bpm": 100,
|
||||
"speed": 1.3
|
||||
}
|
||||
}
|
@ -1,113 +0,0 @@
|
||||
-- Script made by Washo789, please, if you use it or modify it, I would like you to give me credits.
|
||||
|
||||
local xx = 520; -- Code to change the position of the camera to the left or right for your opponent, Less = Left (They can be negative numbers), More = Right
|
||||
local yy = 350; -- Code to change the position of the camera up or down for the enemy Less = Down (They can be negative numbers), More = Up
|
||||
local xx2 = 820; -- Same code as above, but for boyfriend left, right
|
||||
local yy2 = 550; -- Same code as above, but for boyfriend up, down
|
||||
local xx3 = 520; -- Same code as above, but for girlfriend left, right
|
||||
local yy3 = 450; -- Same code as above, but for girlfriend, up, down
|
||||
local ofs = 35; -- Code to adjust the intensity with which the camera moves, the more numbers, the more intense, and the fewer numbers, less intense
|
||||
local followchars = true; -- This code is necessary for the script to work, don't even think about deleting it!
|
||||
local del = 0;
|
||||
local del2 = 0;
|
||||
|
||||
function onUpdate() -- The Main Code
|
||||
if del > 0 then
|
||||
del = del - 1
|
||||
end
|
||||
if del2 > 0 then
|
||||
del2 = del2 - 1
|
||||
end
|
||||
if followchars == true then
|
||||
if mustHitSection == false then -- Code for the camera to follow the poses of your opponent
|
||||
if getProperty('dad.animation.curAnim.name') == 'singLEFT' then
|
||||
triggerEvent('Camera Follow Pos',xx-ofs,yy)
|
||||
end
|
||||
if getProperty('dad.animation.curAnim.name') == 'singRIGHT' then
|
||||
triggerEvent('Camera Follow Pos',xx+ofs,yy)
|
||||
end
|
||||
if getProperty('dad.animation.curAnim.name') == 'singUP' then
|
||||
triggerEvent('Camera Follow Pos',xx,yy-ofs)
|
||||
end
|
||||
if getProperty('dad.animation.curAnim.name') == 'singDOWN' then
|
||||
triggerEvent('Camera Follow Pos',xx,yy+ofs)
|
||||
end
|
||||
if getProperty('dad.animation.curAnim.name') == 'singLEFT-alt' then
|
||||
triggerEvent('Camera Follow Pos',xx-ofs,yy)
|
||||
end
|
||||
if getProperty('dad.animation.curAnim.name') == 'singRIGHT-alt' then
|
||||
triggerEvent('Camera Follow Pos',xx+ofs,yy)
|
||||
end
|
||||
if getProperty('dad.animation.curAnim.name') == 'singUP-alt' then
|
||||
triggerEvent('Camera Follow Pos',xx,yy-ofs)
|
||||
end
|
||||
if getProperty('dad.animation.curAnim.name') == 'singDOWN-alt' then
|
||||
triggerEvent('Camera Follow Pos',xx,yy+ofs)
|
||||
end
|
||||
if getProperty('dad.animation.curAnim.name') == 'idle-alt' then
|
||||
triggerEvent('Camera Follow Pos',xx,yy)
|
||||
end
|
||||
if getProperty('dad.animation.curAnim.name') == 'idle' then
|
||||
triggerEvent('Camera Follow Pos',xx,yy)
|
||||
end
|
||||
if gfSection == true then -- The camera follows GF when she sings, only when the "GF Section" option in the chart editor is activated.
|
||||
if getProperty('gf.animation.curAnim.name') == 'singLEFT' then -- Credits to Serebeat and company for their Slaybells mod,
|
||||
triggerEvent('Camera Follow Pos',xx3-ofs,yy3) -- That's where I got the gf code from.
|
||||
end
|
||||
if getProperty('gf.animation.curAnim.name') == 'singRIGHT' then
|
||||
triggerEvent('Camera Follow Pos',xx3+ofs,yy3)
|
||||
end
|
||||
if getProperty('gf.animation.curAnim.name') == 'singUP' then
|
||||
triggerEvent('Camera Follow Pos',xx3,yy3-ofs)
|
||||
end
|
||||
if getProperty('gf.animation.curAnim.name') == 'singDOWN' then
|
||||
triggerEvent('Camera Follow Pos',xx3,yy3+ofs)
|
||||
end
|
||||
if getProperty('gf.animation.curAnim.name') == 'idle-alt' then
|
||||
triggerEvent('Camera Follow Pos',xx3,yy3)
|
||||
end
|
||||
if getProperty('gf.animation.curAnim.name') == 'singRIGHT-alt' then
|
||||
triggerEvent('Camera Follow Pos',xx3+ofs,yy3)
|
||||
end
|
||||
if getProperty('gf.animation.curAnim.name') == 'singUP-alt' then
|
||||
triggerEvent('Camera Follow Pos',xx3,yy3-ofs)
|
||||
end
|
||||
if getProperty('gf.animation.curAnim.name') == 'singDOWN-alt' then
|
||||
triggerEvent('Camera Follow Pos',xx3,yy3+ofs)
|
||||
end
|
||||
if getProperty('gf.animation.curAnim.name') == 'idle-alt' then
|
||||
triggerEvent('Camera Follow Pos',xx3,yy3)
|
||||
end
|
||||
end
|
||||
else
|
||||
-- Code for the camera to follow the poses of boyfriend
|
||||
if getProperty('boyfriend.animation.curAnim.name') == 'singLEFT' then
|
||||
triggerEvent('Camera Follow Pos',xx2-ofs,yy2)
|
||||
end
|
||||
if getProperty('boyfriend.animation.curAnim.name') == 'singRIGHT' then
|
||||
triggerEvent('Camera Follow Pos',xx2+ofs,yy2)
|
||||
end
|
||||
if getProperty('boyfriend.animation.curAnim.name') == 'singUP' then
|
||||
triggerEvent('Camera Follow Pos',xx2,yy2-ofs)
|
||||
end
|
||||
if getProperty('boyfriend.animation.curAnim.name') == 'singDOWN' then
|
||||
triggerEvent('Camera Follow Pos',xx2,yy2+ofs)
|
||||
end
|
||||
if getProperty('boyfriend.animation.curAnim.name') == 'singRIGHT-alt' then
|
||||
triggerEvent('Camera Follow Pos',xx2+ofs,yy2)
|
||||
end
|
||||
if getProperty('boyfriend.animation.curAnim.name') == 'singUP-alt' then
|
||||
triggerEvent('Camera Follow Pos',xx2,yy2-ofs)
|
||||
end
|
||||
if getProperty('boyfriend.animation.curAnim.name') == 'singDOWN-alt' then
|
||||
triggerEvent('Camera Follow Pos',xx2,yy2+ofs)
|
||||
end
|
||||
if getProperty('boyfriend.animation.curAnim.name') == 'idle-alt' then
|
||||
triggerEvent('Camera Follow Pos',xx2,yy2)
|
||||
end
|
||||
end
|
||||
else
|
||||
triggerEvent('Camera Follow Pos','','') -- Self explanatory
|
||||
end
|
||||
|
||||
end
|
@ -6511,7 +6511,7 @@
|
||||
"song": "Dad Battle Erect",
|
||||
"validScore": true,
|
||||
"needsVoices": true,
|
||||
"stage": "stage",
|
||||
"stage": "stageErect",
|
||||
"speed": 2.6,
|
||||
"bpm": 190
|
||||
}
|
||||
|
@ -1,97 +0,0 @@
|
||||
-- RANK ONLY UP TILL 20, 0 MINIMUM, CHANGE THIS TO SUGGEST HOW HARD THE SONG IS, BY MARKEDAMAN
|
||||
|
||||
function onCreate()
|
||||
if difficulty == 0 then -- easy
|
||||
rank = 1
|
||||
elseif difficulty == 1 then -- normal
|
||||
rank = 1
|
||||
elseif difficulty == 2 then -- hard
|
||||
rank = 2
|
||||
elseif difficulty == 3 then -- erect
|
||||
rank = 6
|
||||
elseif difficulty == 4 then -- nightmare
|
||||
rank = 7
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
function onCreatePost()
|
||||
if not hideHud then
|
||||
if rank > 10 then
|
||||
makeLuaSprite('star', 'star2', 1070, 590)
|
||||
makeAnimatedLuaSprite('starFlame', 'starFlame', 1030, 440)
|
||||
addAnimationByPrefix('starFlame', 'starFlame', 'fire loop full instance', 24, true)
|
||||
setProperty('starFlame.alpha', 0)
|
||||
scaleObject('starFlame', 1.5, 1.5)
|
||||
setObjectCamera('starFlame', 'hud')
|
||||
addLuaSprite('starFlame', true)
|
||||
elseif rank <= 10 then
|
||||
makeLuaSprite('star', 'star1', 1070, 590)
|
||||
end
|
||||
|
||||
scaleObject('star', 0.9, 0.9)
|
||||
setObjectCamera('star', 'hud')
|
||||
setObjectOrder('star', getObjectOrder('starFlame') + 1)
|
||||
setProperty('star.alpha', 0)
|
||||
addLuaSprite('star')
|
||||
|
||||
makeLuaText('difficulty', ''.. rank ..'', 2230 , 0, 620)
|
||||
setTextSize('difficulty', 37)
|
||||
setTextFont('difficulty', 'combo.ttf')
|
||||
setProperty('difficulty.alpha', 0)
|
||||
addLuaText('difficulty', false)
|
||||
setObjectOrder('difficulty', getObjectOrder('star') + 1)
|
||||
|
||||
if downscroll then
|
||||
setProperty('difficulty.y', 70)
|
||||
setProperty('star.y', 40)
|
||||
setProperty('starFlame.y', -5)
|
||||
setProperty('starFlame.angle', 190)
|
||||
end
|
||||
|
||||
|
||||
|
||||
if rank > 10 then
|
||||
setTextColor('difficulty', 'ffffff')
|
||||
setTextBorder('difficulty', 2, '00AEFF')
|
||||
elseif rank <= 10 then
|
||||
setTextColor('difficulty', '000000')
|
||||
setTextBorder('difficulty', 3, 'FFFFFF')
|
||||
end
|
||||
|
||||
|
||||
runTimer('ready', 0.5) -- star fade in
|
||||
runTimer('wait', 8) -- star fade out
|
||||
runTimer('wait2', 7.5) -- difficulty fade out
|
||||
|
||||
if rank > 10 then
|
||||
runTimer('pausefire', 2) -- difficulty fade in
|
||||
elseif rank <=10 then
|
||||
runTimer('pause', 2)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function onTimerCompleted(tag)
|
||||
if not hideHud then
|
||||
if tag == 'ready' then
|
||||
doTweenAlpha('hi', 'star', 1, 0.5,'linear')
|
||||
end
|
||||
if tag == 'wait' then
|
||||
doTweenAlpha('gone', 'star', 0, 0.5,'linear')
|
||||
doTweenAlpha('fireout', 'starFlame', 0, 0.5,'linear')
|
||||
end
|
||||
if tag == 'wait2' then
|
||||
doTweenAlpha('bye', 'difficulty', 0, 0.5,'linear')
|
||||
end
|
||||
if tag == 'pause' then
|
||||
doTweenAlpha('hi2', 'difficulty', 1, 0.5,'linear')
|
||||
end
|
||||
if tag == 'pausefire' then
|
||||
setProperty('difficulty.alpha', 1)
|
||||
setProperty('starFlame.alpha', 1)
|
||||
playSound('light', 0.7)
|
||||
end
|
||||
end
|
||||
end
|
@ -1,4 +0,0 @@
|
||||
function onCreate()
|
||||
setTextFont('scoreTxt', 'vcr.ttf')
|
||||
setTextFont('timeTxt','timer.ttf')
|
||||
end
|
@ -3119,7 +3119,7 @@
|
||||
"player3": null,
|
||||
"song": "Fresh Erect",
|
||||
"needsVoices": true,
|
||||
"stage": "stage",
|
||||
"stage": "stageErect",
|
||||
"validScore": true,
|
||||
"speed": 2.4,
|
||||
"bpm": 125
|
||||
|
@ -1,113 +0,0 @@
|
||||
-- Script made by Washo789, please, if you use it or modify it, I would like you to give me credits.
|
||||
|
||||
local xx = 520; -- Code to change the position of the camera to the left or right for your opponent, Less = Left (They can be negative numbers), More = Right
|
||||
local yy = 350; -- Code to change the position of the camera up or down for the enemy Less = Down (They can be negative numbers), More = Up
|
||||
local xx2 = 820; -- Same code as above, but for boyfriend left, right
|
||||
local yy2 = 550; -- Same code as above, but for boyfriend up, down
|
||||
local xx3 = 520; -- Same code as above, but for girlfriend left, right
|
||||
local yy3 = 450; -- Same code as above, but for girlfriend, up, down
|
||||
local ofs = 35; -- Code to adjust the intensity with which the camera moves, the more numbers, the more intense, and the fewer numbers, less intense
|
||||
local followchars = true; -- This code is necessary for the script to work, don't even think about deleting it!
|
||||
local del = 0;
|
||||
local del2 = 0;
|
||||
|
||||
function onUpdate() -- The Main Code
|
||||
if del > 0 then
|
||||
del = del - 1
|
||||
end
|
||||
if del2 > 0 then
|
||||
del2 = del2 - 1
|
||||
end
|
||||
if followchars == true then
|
||||
if mustHitSection == false then -- Code for the camera to follow the poses of your opponent
|
||||
if getProperty('dad.animation.curAnim.name') == 'singLEFT' then
|
||||
triggerEvent('Camera Follow Pos',xx-ofs,yy)
|
||||
end
|
||||
if getProperty('dad.animation.curAnim.name') == 'singRIGHT' then
|
||||
triggerEvent('Camera Follow Pos',xx+ofs,yy)
|
||||
end
|
||||
if getProperty('dad.animation.curAnim.name') == 'singUP' then
|
||||
triggerEvent('Camera Follow Pos',xx,yy-ofs)
|
||||
end
|
||||
if getProperty('dad.animation.curAnim.name') == 'singDOWN' then
|
||||
triggerEvent('Camera Follow Pos',xx,yy+ofs)
|
||||
end
|
||||
if getProperty('dad.animation.curAnim.name') == 'singLEFT-alt' then
|
||||
triggerEvent('Camera Follow Pos',xx-ofs,yy)
|
||||
end
|
||||
if getProperty('dad.animation.curAnim.name') == 'singRIGHT-alt' then
|
||||
triggerEvent('Camera Follow Pos',xx+ofs,yy)
|
||||
end
|
||||
if getProperty('dad.animation.curAnim.name') == 'singUP-alt' then
|
||||
triggerEvent('Camera Follow Pos',xx,yy-ofs)
|
||||
end
|
||||
if getProperty('dad.animation.curAnim.name') == 'singDOWN-alt' then
|
||||
triggerEvent('Camera Follow Pos',xx,yy+ofs)
|
||||
end
|
||||
if getProperty('dad.animation.curAnim.name') == 'idle-alt' then
|
||||
triggerEvent('Camera Follow Pos',xx,yy)
|
||||
end
|
||||
if getProperty('dad.animation.curAnim.name') == 'idle' then
|
||||
triggerEvent('Camera Follow Pos',xx,yy)
|
||||
end
|
||||
if gfSection == true then -- The camera follows GF when she sings, only when the "GF Section" option in the chart editor is activated.
|
||||
if getProperty('gf.animation.curAnim.name') == 'singLEFT' then -- Credits to Serebeat and company for their Slaybells mod,
|
||||
triggerEvent('Camera Follow Pos',xx3-ofs,yy3) -- That's where I got the gf code from.
|
||||
end
|
||||
if getProperty('gf.animation.curAnim.name') == 'singRIGHT' then
|
||||
triggerEvent('Camera Follow Pos',xx3+ofs,yy3)
|
||||
end
|
||||
if getProperty('gf.animation.curAnim.name') == 'singUP' then
|
||||
triggerEvent('Camera Follow Pos',xx3,yy3-ofs)
|
||||
end
|
||||
if getProperty('gf.animation.curAnim.name') == 'singDOWN' then
|
||||
triggerEvent('Camera Follow Pos',xx3,yy3+ofs)
|
||||
end
|
||||
if getProperty('gf.animation.curAnim.name') == 'idle-alt' then
|
||||
triggerEvent('Camera Follow Pos',xx3,yy3)
|
||||
end
|
||||
if getProperty('gf.animation.curAnim.name') == 'singRIGHT-alt' then
|
||||
triggerEvent('Camera Follow Pos',xx3+ofs,yy3)
|
||||
end
|
||||
if getProperty('gf.animation.curAnim.name') == 'singUP-alt' then
|
||||
triggerEvent('Camera Follow Pos',xx3,yy3-ofs)
|
||||
end
|
||||
if getProperty('gf.animation.curAnim.name') == 'singDOWN-alt' then
|
||||
triggerEvent('Camera Follow Pos',xx3,yy3+ofs)
|
||||
end
|
||||
if getProperty('gf.animation.curAnim.name') == 'idle-alt' then
|
||||
triggerEvent('Camera Follow Pos',xx3,yy3)
|
||||
end
|
||||
end
|
||||
else
|
||||
-- Code for the camera to follow the poses of boyfriend
|
||||
if getProperty('boyfriend.animation.curAnim.name') == 'singLEFT' then
|
||||
triggerEvent('Camera Follow Pos',xx2-ofs,yy2)
|
||||
end
|
||||
if getProperty('boyfriend.animation.curAnim.name') == 'singRIGHT' then
|
||||
triggerEvent('Camera Follow Pos',xx2+ofs,yy2)
|
||||
end
|
||||
if getProperty('boyfriend.animation.curAnim.name') == 'singUP' then
|
||||
triggerEvent('Camera Follow Pos',xx2,yy2-ofs)
|
||||
end
|
||||
if getProperty('boyfriend.animation.curAnim.name') == 'singDOWN' then
|
||||
triggerEvent('Camera Follow Pos',xx2,yy2+ofs)
|
||||
end
|
||||
if getProperty('boyfriend.animation.curAnim.name') == 'singRIGHT-alt' then
|
||||
triggerEvent('Camera Follow Pos',xx2+ofs,yy2)
|
||||
end
|
||||
if getProperty('boyfriend.animation.curAnim.name') == 'singUP-alt' then
|
||||
triggerEvent('Camera Follow Pos',xx2,yy2-ofs)
|
||||
end
|
||||
if getProperty('boyfriend.animation.curAnim.name') == 'singDOWN-alt' then
|
||||
triggerEvent('Camera Follow Pos',xx2,yy2+ofs)
|
||||
end
|
||||
if getProperty('boyfriend.animation.curAnim.name') == 'idle-alt' then
|
||||
triggerEvent('Camera Follow Pos',xx2,yy2)
|
||||
end
|
||||
end
|
||||
else
|
||||
triggerEvent('Camera Follow Pos','','') -- Self explanatory
|
||||
end
|
||||
|
||||
end
|
1
charts/high/high-easy.json
Normal file
1
charts/high/high-normal.json
Normal file
@ -1,4 +0,0 @@
|
||||
function onCreate()
|
||||
setTextFont('scoreTxt', 'vcr.ttf')
|
||||
setTextFont('timeTxt','timer.ttf')
|
||||
end
|
@ -2,19 +2,27 @@ return {
|
||||
{
|
||||
name = "tutorial",
|
||||
difficulties = {
|
||||
"hard"
|
||||
"easy",
|
||||
"normal",
|
||||
"hard",
|
||||
},
|
||||
},
|
||||
{
|
||||
name = "bopeebo",
|
||||
difficulties = {
|
||||
"hard"
|
||||
"easy",
|
||||
"normal",
|
||||
"hard",
|
||||
"erect"
|
||||
},
|
||||
},
|
||||
{
|
||||
name = "fresh",
|
||||
difficulties = {
|
||||
"hard"
|
||||
"easy",
|
||||
"normal",
|
||||
"hard",
|
||||
"erect"
|
||||
},
|
||||
},
|
||||
{
|
||||
@ -29,14 +37,19 @@ return {
|
||||
{
|
||||
name = "south",
|
||||
difficulties = {
|
||||
"hard"
|
||||
"easy",
|
||||
"normal",
|
||||
"hard",
|
||||
"erect"
|
||||
},
|
||||
},
|
||||
{
|
||||
name = "high",
|
||||
difficulties = {
|
||||
"easy",
|
||||
"normal",
|
||||
"hard",
|
||||
"erect",
|
||||
"nightmare"
|
||||
},
|
||||
},
|
||||
{
|
||||
|
@ -1,97 +0,0 @@
|
||||
-- RANK ONLY UP TILL 20, 0 MINIMUM, CHANGE THIS TO SUGGEST HOW HARD THE SONG IS, BY MARKEDAMAN
|
||||
|
||||
function onCreate()
|
||||
if difficulty == 0 then -- easy
|
||||
rank = 2
|
||||
elseif difficulty == 1 then -- normal
|
||||
rank = 2
|
||||
elseif difficulty == 2 then -- hard
|
||||
rank = 3
|
||||
elseif difficulty == 3 then -- erect
|
||||
rank = 10
|
||||
elseif difficulty == 4 then -- nightmare
|
||||
rank = 11
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
function onCreatePost()
|
||||
if not hideHud then
|
||||
if rank > 10 then
|
||||
makeLuaSprite('star', 'star2', 1070, 590)
|
||||
makeAnimatedLuaSprite('starFlame', 'starFlame', 1030, 440)
|
||||
addAnimationByPrefix('starFlame', 'starFlame', 'fire loop full instance', 24, true)
|
||||
setProperty('starFlame.alpha', 0)
|
||||
scaleObject('starFlame', 1.5, 1.5)
|
||||
setObjectCamera('starFlame', 'hud')
|
||||
addLuaSprite('starFlame', true)
|
||||
elseif rank <= 10 then
|
||||
makeLuaSprite('star', 'star1', 1070, 590)
|
||||
end
|
||||
|
||||
scaleObject('star', 0.9, 0.9)
|
||||
setObjectCamera('star', 'hud')
|
||||
setObjectOrder('star', getObjectOrder('starFlame') + 1)
|
||||
setProperty('star.alpha', 0)
|
||||
addLuaSprite('star')
|
||||
|
||||
makeLuaText('difficulty', ''.. rank ..'', 2230 , 0, 620)
|
||||
setTextSize('difficulty', 37)
|
||||
setTextFont('difficulty', 'combo.ttf')
|
||||
setProperty('difficulty.alpha', 0)
|
||||
addLuaText('difficulty', false)
|
||||
setObjectOrder('difficulty', getObjectOrder('star') + 1)
|
||||
|
||||
if downscroll then
|
||||
setProperty('difficulty.y', 70)
|
||||
setProperty('star.y', 40)
|
||||
setProperty('starFlame.y', -5)
|
||||
setProperty('starFlame.angle', 190)
|
||||
end
|
||||
|
||||
|
||||
|
||||
if rank > 10 then
|
||||
setTextColor('difficulty', 'ffffff')
|
||||
setTextBorder('difficulty', 2, '00AEFF')
|
||||
elseif rank <= 10 then
|
||||
setTextColor('difficulty', '000000')
|
||||
setTextBorder('difficulty', 3, 'FFFFFF')
|
||||
end
|
||||
|
||||
|
||||
runTimer('ready', 0.5) -- star fade in
|
||||
runTimer('wait', 8) -- star fade out
|
||||
runTimer('wait2', 7.5) -- difficulty fade out
|
||||
|
||||
if rank > 10 then
|
||||
runTimer('pausefire', 2) -- difficulty fade in
|
||||
elseif rank <=10 then
|
||||
runTimer('pause', 2)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function onTimerCompleted(tag)
|
||||
if not hideHud then
|
||||
if tag == 'ready' then
|
||||
doTweenAlpha('hi', 'star', 1, 0.5,'linear')
|
||||
end
|
||||
if tag == 'wait' then
|
||||
doTweenAlpha('gone', 'star', 0, 0.5,'linear')
|
||||
doTweenAlpha('fireout', 'starFlame', 0, 0.5,'linear')
|
||||
end
|
||||
if tag == 'wait2' then
|
||||
doTweenAlpha('bye', 'difficulty', 0, 0.5,'linear')
|
||||
end
|
||||
if tag == 'pause' then
|
||||
doTweenAlpha('hi2', 'difficulty', 1, 0.5,'linear')
|
||||
end
|
||||
if tag == 'pausefire' then
|
||||
setProperty('difficulty.alpha', 1)
|
||||
setProperty('starFlame.alpha', 1)
|
||||
playSound('light', 0.7)
|
||||
end
|
||||
end
|
||||
end
|
@ -1,4 +0,0 @@
|
||||
function onCreate()
|
||||
setTextFont('scoreTxt', 'vcr.ttf')
|
||||
setTextFont('timeTxt','timer.ttf')
|
||||
end
|
@ -1,113 +0,0 @@
|
||||
-- Script made by Washo789, please, if you use it or modify it, I would like you to give me credits.
|
||||
|
||||
local xx = 520; -- Code to change the position of the camera to the left or right for your opponent, Less = Left (They can be negative numbers), More = Right
|
||||
local yy = 480; -- Code to change the position of the camera up or down for the enemy Less = Down (They can be negative numbers), More = Up
|
||||
local xx2 = 820; -- Same code as above, but for boyfriend left, right
|
||||
local yy2 = 550; -- Same code as above, but for boyfriend up, down
|
||||
local xx3 = 520; -- Same code as above, but for girlfriend left, right
|
||||
local yy3 = 450; -- Same code as above, but for girlfriend, up, down
|
||||
local ofs = 35; -- Code to adjust the intensity with which the camera moves, the more numbers, the more intense, and the fewer numbers, less intense
|
||||
local followchars = true; -- This code is necessary for the script to work, don't even think about deleting it!
|
||||
local del = 0;
|
||||
local del2 = 0;
|
||||
|
||||
function onUpdate() -- The Main Code
|
||||
if del > 0 then
|
||||
del = del - 1
|
||||
end
|
||||
if del2 > 0 then
|
||||
del2 = del2 - 1
|
||||
end
|
||||
if followchars == true then
|
||||
if mustHitSection == false then -- Code for the camera to follow the poses of your opponent
|
||||
if getProperty('dad.animation.curAnim.name') == 'singLEFT' then
|
||||
triggerEvent('Camera Follow Pos',xx-ofs,yy)
|
||||
end
|
||||
if getProperty('dad.animation.curAnim.name') == 'singRIGHT' then
|
||||
triggerEvent('Camera Follow Pos',xx+ofs,yy)
|
||||
end
|
||||
if getProperty('dad.animation.curAnim.name') == 'singUP' then
|
||||
triggerEvent('Camera Follow Pos',xx,yy-ofs)
|
||||
end
|
||||
if getProperty('dad.animation.curAnim.name') == 'singDOWN' then
|
||||
triggerEvent('Camera Follow Pos',xx,yy+ofs)
|
||||
end
|
||||
if getProperty('dad.animation.curAnim.name') == 'singLEFT-alt' then
|
||||
triggerEvent('Camera Follow Pos',xx-ofs,yy)
|
||||
end
|
||||
if getProperty('dad.animation.curAnim.name') == 'singRIGHT-alt' then
|
||||
triggerEvent('Camera Follow Pos',xx+ofs,yy)
|
||||
end
|
||||
if getProperty('dad.animation.curAnim.name') == 'singUP-alt' then
|
||||
triggerEvent('Camera Follow Pos',xx,yy-ofs)
|
||||
end
|
||||
if getProperty('dad.animation.curAnim.name') == 'singDOWN-alt' then
|
||||
triggerEvent('Camera Follow Pos',xx,yy+ofs)
|
||||
end
|
||||
if getProperty('dad.animation.curAnim.name') == 'idle-alt' then
|
||||
triggerEvent('Camera Follow Pos',xx,yy)
|
||||
end
|
||||
if getProperty('dad.animation.curAnim.name') == 'idle' then
|
||||
triggerEvent('Camera Follow Pos',xx,yy)
|
||||
end
|
||||
if gfSection == true then -- The camera follows GF when she sings, only when the "GF Section" option in the chart editor is activated.
|
||||
if getProperty('gf.animation.curAnim.name') == 'singLEFT' then -- Credits to Serebeat and company for their Slaybells mod,
|
||||
triggerEvent('Camera Follow Pos',xx3-ofs,yy3) -- That's where I got the gf code from.
|
||||
end
|
||||
if getProperty('gf.animation.curAnim.name') == 'singRIGHT' then
|
||||
triggerEvent('Camera Follow Pos',xx3+ofs,yy3)
|
||||
end
|
||||
if getProperty('gf.animation.curAnim.name') == 'singUP' then
|
||||
triggerEvent('Camera Follow Pos',xx3,yy3-ofs)
|
||||
end
|
||||
if getProperty('gf.animation.curAnim.name') == 'singDOWN' then
|
||||
triggerEvent('Camera Follow Pos',xx3,yy3+ofs)
|
||||
end
|
||||
if getProperty('gf.animation.curAnim.name') == 'idle-alt' then
|
||||
triggerEvent('Camera Follow Pos',xx3,yy3)
|
||||
end
|
||||
if getProperty('gf.animation.curAnim.name') == 'singRIGHT-alt' then
|
||||
triggerEvent('Camera Follow Pos',xx3+ofs,yy3)
|
||||
end
|
||||
if getProperty('gf.animation.curAnim.name') == 'singUP-alt' then
|
||||
triggerEvent('Camera Follow Pos',xx3,yy3-ofs)
|
||||
end
|
||||
if getProperty('gf.animation.curAnim.name') == 'singDOWN-alt' then
|
||||
triggerEvent('Camera Follow Pos',xx3,yy3+ofs)
|
||||
end
|
||||
if getProperty('gf.animation.curAnim.name') == 'idle-alt' then
|
||||
triggerEvent('Camera Follow Pos',xx3,yy3)
|
||||
end
|
||||
end
|
||||
else
|
||||
-- Code for the camera to follow the poses of boyfriend
|
||||
if getProperty('boyfriend.animation.curAnim.name') == 'singLEFT' then
|
||||
triggerEvent('Camera Follow Pos',xx2-ofs,yy2)
|
||||
end
|
||||
if getProperty('boyfriend.animation.curAnim.name') == 'singRIGHT' then
|
||||
triggerEvent('Camera Follow Pos',xx2+ofs,yy2)
|
||||
end
|
||||
if getProperty('boyfriend.animation.curAnim.name') == 'singUP' then
|
||||
triggerEvent('Camera Follow Pos',xx2,yy2-ofs)
|
||||
end
|
||||
if getProperty('boyfriend.animation.curAnim.name') == 'singDOWN' then
|
||||
triggerEvent('Camera Follow Pos',xx2,yy2+ofs)
|
||||
end
|
||||
if getProperty('boyfriend.animation.curAnim.name') == 'singRIGHT-alt' then
|
||||
triggerEvent('Camera Follow Pos',xx2+ofs,yy2)
|
||||
end
|
||||
if getProperty('boyfriend.animation.curAnim.name') == 'singUP-alt' then
|
||||
triggerEvent('Camera Follow Pos',xx2,yy2-ofs)
|
||||
end
|
||||
if getProperty('boyfriend.animation.curAnim.name') == 'singDOWN-alt' then
|
||||
triggerEvent('Camera Follow Pos',xx2,yy2+ofs)
|
||||
end
|
||||
if getProperty('boyfriend.animation.curAnim.name') == 'idle-alt' then
|
||||
triggerEvent('Camera Follow Pos',xx2,yy2)
|
||||
end
|
||||
end
|
||||
else
|
||||
triggerEvent('Camera Follow Pos','','') -- Self explanatory
|
||||
end
|
||||
|
||||
end
|
@ -1,97 +0,0 @@
|
||||
-- RANK ONLY UP TILL 20, 0 MINIMUM, CHANGE THIS TO SUGGEST HOW HARD THE SONG IS, BY MARKEDAMAN
|
||||
|
||||
function onCreate()
|
||||
if difficulty == 0 then -- easy
|
||||
rank = 0
|
||||
elseif difficulty == 1 then -- normal
|
||||
rank = 0
|
||||
elseif difficulty == 2 then -- hard
|
||||
rank = 0
|
||||
elseif difficulty == 3 then -- erect
|
||||
rank = 8
|
||||
elseif difficulty == 4 then -- nightmare
|
||||
rank = 9
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
function onCreatePost()
|
||||
if not hideHud then
|
||||
if rank > 10 then
|
||||
makeLuaSprite('star', 'star2', 1070, 590)
|
||||
makeAnimatedLuaSprite('starFlame', 'starFlame', 1030, 440)
|
||||
addAnimationByPrefix('starFlame', 'starFlame', 'fire loop full instance', 24, true)
|
||||
setProperty('starFlame.alpha', 0)
|
||||
scaleObject('starFlame', 1.5, 1.5)
|
||||
setObjectCamera('starFlame', 'hud')
|
||||
addLuaSprite('starFlame', true)
|
||||
elseif rank <= 10 then
|
||||
makeLuaSprite('star', 'star1', 1070, 590)
|
||||
end
|
||||
|
||||
scaleObject('star', 0.9, 0.9)
|
||||
setObjectCamera('star', 'hud')
|
||||
setObjectOrder('star', getObjectOrder('starFlame') + 1)
|
||||
setProperty('star.alpha', 0)
|
||||
addLuaSprite('star')
|
||||
|
||||
makeLuaText('difficulty', ''.. rank ..'', 2230 , 0, 620)
|
||||
setTextSize('difficulty', 37)
|
||||
setTextFont('difficulty', 'combo.ttf')
|
||||
setProperty('difficulty.alpha', 0)
|
||||
addLuaText('difficulty', false)
|
||||
setObjectOrder('difficulty', getObjectOrder('star') + 1)
|
||||
|
||||
if downscroll then
|
||||
setProperty('difficulty.y', 70)
|
||||
setProperty('star.y', 40)
|
||||
setProperty('starFlame.y', -5)
|
||||
setProperty('starFlame.angle', 190)
|
||||
end
|
||||
|
||||
|
||||
|
||||
if rank > 10 then
|
||||
setTextColor('difficulty', 'ffffff')
|
||||
setTextBorder('difficulty', 2, '00AEFF')
|
||||
elseif rank <= 10 then
|
||||
setTextColor('difficulty', '000000')
|
||||
setTextBorder('difficulty', 3, 'FFFFFF')
|
||||
end
|
||||
|
||||
|
||||
runTimer('ready', 0.5) -- star fade in
|
||||
runTimer('wait', 8) -- star fade out
|
||||
runTimer('wait2', 7.5) -- difficulty fade out
|
||||
|
||||
if rank > 10 then
|
||||
runTimer('pausefire', 2) -- difficulty fade in
|
||||
elseif rank <=10 then
|
||||
runTimer('pause', 2)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function onTimerCompleted(tag)
|
||||
if not hideHud then
|
||||
if tag == 'ready' then
|
||||
doTweenAlpha('hi', 'star', 1, 0.5,'linear')
|
||||
end
|
||||
if tag == 'wait' then
|
||||
doTweenAlpha('gone', 'star', 0, 0.5,'linear')
|
||||
doTweenAlpha('fireout', 'starFlame', 0, 0.5,'linear')
|
||||
end
|
||||
if tag == 'wait2' then
|
||||
doTweenAlpha('bye', 'difficulty', 0, 0.5,'linear')
|
||||
end
|
||||
if tag == 'pause' then
|
||||
doTweenAlpha('hi2', 'difficulty', 1, 0.5,'linear')
|
||||
end
|
||||
if tag == 'pausefire' then
|
||||
setProperty('difficulty.alpha', 1)
|
||||
setProperty('starFlame.alpha', 1)
|
||||
playSound('light', 0.7)
|
||||
end
|
||||
end
|
||||
end
|
@ -1,4 +0,0 @@
|
||||
function onCreate()
|
||||
setTextFont('scoreTxt', 'vcr.ttf')
|
||||
setTextFont('timeTxt','timer.ttf')
|
||||
end
|
1
charts/tutorial/tutorial-normal.json
Normal file
BIN
images/stage/erect/backDark.png
Normal file
After Width: | Height: | Size: 1.6 KiB |
BIN
images/stage/erect/bg.png
Normal file
After Width: | Height: | Size: 163 KiB |
BIN
images/stage/erect/brightLightSmall.png
Normal file
After Width: | Height: | Size: 66 KiB |
BIN
images/stage/erect/lightAbove.png
Normal file
After Width: | Height: | Size: 70 KiB |
BIN
images/stage/erect/lightgreen.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
images/stage/erect/lightred.png
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
images/stage/erect/lights.png
Normal file
After Width: | Height: | Size: 119 KiB |
BIN
images/stage/erect/orangeLight.png
Normal file
After Width: | Height: | Size: 30 KiB |
BIN
images/stage/erect/server.png
Normal file
After Width: | Height: | Size: 53 KiB |
2
main.lua
@ -65,7 +65,7 @@ function love.update(dt)
|
||||
curState.finish()
|
||||
end
|
||||
elseif not curState then
|
||||
myTypes.cameraTarget = myTypes.Vector2(0,0)
|
||||
myTypes.render.cameraTarget = myTypes.Vector2(0,0)
|
||||
myTypes.updateSprites(dt)
|
||||
end
|
||||
end
|
||||
|
@ -76,22 +76,26 @@ local function state(songName, songDifficulty)
|
||||
{
|
||||
rating = "sick",
|
||||
hitWindow = 45,
|
||||
spawnSplash = true
|
||||
spawnSplash = true,
|
||||
score = 300
|
||||
},
|
||||
{
|
||||
rating = "good",
|
||||
hitWindow = 90,
|
||||
spawnSplash = false
|
||||
spawnSplash = false,
|
||||
score = 200
|
||||
},
|
||||
{
|
||||
rating = "bad",
|
||||
hitWindow = 135,
|
||||
spawnSplash = false
|
||||
spawnSplash = false,
|
||||
score = 100
|
||||
},
|
||||
{
|
||||
rating = "shit",
|
||||
hitWindow = 300,
|
||||
spawnSplash = false
|
||||
spawnSplash = false,
|
||||
score = 50
|
||||
}
|
||||
}
|
||||
|
||||
@ -241,7 +245,7 @@ local function state(songName, songDifficulty)
|
||||
function state.update(dt)
|
||||
if not playing then
|
||||
if dead then
|
||||
myTypes.cameraTarget = deadBF.stageCamera
|
||||
myTypes.render.cameraTarget = deadBF.stageCamera
|
||||
if not restart then
|
||||
if deadBF and deadBF.sprite.ended then
|
||||
deadBF:PlayAnimation("deathLoop")
|
||||
@ -314,16 +318,16 @@ local function state(songName, songDifficulty)
|
||||
if not section.gfSection then
|
||||
if section.mustHitSection then
|
||||
local currentSingVector = singVectors[characters.bf.animation] or myTypes.Vector2()
|
||||
myTypes.cameraTarget = myTypes.Vector2(-stage.camera_boyfriend[1], -stage.camera_boyfriend[2]):Add(characters.bf.stageCamera:Negate()):Add(myTypes.Vector2(0, -200)):Add(currentSingVector)
|
||||
myTypes.render.cameraTarget = myTypes.Vector2(-stage.camera_boyfriend[1], -stage.camera_boyfriend[2]):Add(characters.bf.stageCamera:Negate()):Add(myTypes.Vector2(0, -200)):Add(currentSingVector)
|
||||
else
|
||||
if characters.dad then
|
||||
local currentSingVector = singVectors[characters.dad.animation] or myTypes.Vector2()
|
||||
myTypes.cameraTarget = myTypes.Vector2(stage.camera_opponent[1], stage.camera_opponent[2]):Add(characters.dad.stageCamera:Negate()):Add(myTypes.Vector2(0, -200)):Add(currentSingVector)
|
||||
myTypes.render.cameraTarget = myTypes.Vector2(stage.camera_opponent[1], stage.camera_opponent[2]):Add(characters.dad.stageCamera:Negate()):Add(myTypes.Vector2(0, -200)):Add(currentSingVector)
|
||||
end
|
||||
end
|
||||
else
|
||||
local currentSingVector = singVectors[characters.gf.animation] or myTypes.Vector2()
|
||||
myTypes.cameraTarget = myTypes.Vector2(stage.camera_girlfriend[1], stage.camera_ocamera_girlfriendponent[2]):Add(characters.gf.stageCamera:Negate()):Add(myTypes.Vector2(0, -200)):Add(currentSingVector)
|
||||
myTypes.render.cameraTarget = myTypes.Vector2(stage.camera_girlfriend[1], stage.camera_ocamera_girlfriendponent[2]):Add(characters.gf.stageCamera:Negate()):Add(myTypes.Vector2(0, -200)):Add(currentSingVector)
|
||||
end
|
||||
end
|
||||
|
||||
@ -589,14 +593,14 @@ local function state(songName, songDifficulty)
|
||||
unspawnedNotes[#unspawnedNotes+1] = newNote
|
||||
|
||||
if note[3] > 0 then
|
||||
local length = note[3] / conductor.stepCrochet
|
||||
local length = math.floor(note[3] / conductor.stepCrochet)
|
||||
|
||||
for i = 0, length - .1, .1 do
|
||||
local newHold = myTypes.note({note[1] + i * conductor.stepCrochet, note[2], note[3], note[4]}, section.mustHitSection, true)
|
||||
unspawnedHoldNotes[#unspawnedHoldNotes+1] = newHold
|
||||
|
||||
unspawnedHoldNotes[#unspawnedHoldNotes+1] = newHold
|
||||
end
|
||||
local newHold = myTypes.note({note[1] + math.floor(length) * conductor.stepCrochet, note[2], note[3], note[4]}, section.mustHitSection, true, true)
|
||||
local newHold = myTypes.note({note[1] + length * conductor.stepCrochet, note[2], note[3], note[4]}, section.mustHitSection, true, true)
|
||||
unspawnedHoldNotes[#unspawnedHoldNotes+1] = newHold
|
||||
newHold.holdEnd = true
|
||||
if settings.Downscroll then
|
||||
@ -607,7 +611,7 @@ local function state(songName, songDifficulty)
|
||||
end
|
||||
end
|
||||
|
||||
myTypes.cameraTarget = myTypes.Vector2()
|
||||
myTypes.render.cameraTarget = myTypes.Vector2()
|
||||
|
||||
keyBinds = settings.Keybinds
|
||||
|
||||
|
@ -1,337 +1,9 @@
|
||||
local module = {}
|
||||
|
||||
local myMath = require("modules.math")
|
||||
local files = require("modules.files")
|
||||
local logging = require("modules.logging")
|
||||
local json = require("modules.json")
|
||||
local noteclass = require("modules.types.note")
|
||||
local characterclass = require("modules.types.character")
|
||||
|
||||
local Vector2 = {}
|
||||
Vector2.__index = Vector2
|
||||
|
||||
local Sprite = {}
|
||||
Sprite.__index = Sprite
|
||||
|
||||
local Image = {}
|
||||
Image.__index = Image
|
||||
|
||||
local cachedQuads = {}
|
||||
|
||||
local Sprites = {}
|
||||
local Rects = {}
|
||||
local Images = {}
|
||||
|
||||
function Vector2:Lerp(newVector2, position)
|
||||
return module.Vector2(myMath.lerp(self.x, newVector2.x, position), myMath.lerp(self.y, newVector2.y, position))
|
||||
end
|
||||
|
||||
function Vector2:Get()
|
||||
return self.x, self.y
|
||||
end
|
||||
|
||||
function Vector2:Negate()
|
||||
return module.Vector2(-self.x, -self.y)
|
||||
end
|
||||
|
||||
function Vector2:Add(addVector2)
|
||||
return module.Vector2(self.x + addVector2.x, self.y + addVector2.y)
|
||||
end
|
||||
|
||||
function Vector2:Mul(num)
|
||||
return module.Vector2(self.x * num, self.y * num)
|
||||
end
|
||||
|
||||
function module.Vector2(x, y)
|
||||
return setmetatable({x = x or 0, y = y or 0}, Vector2)
|
||||
end
|
||||
|
||||
function module.Sprite(image, sheet)
|
||||
if not cachedQuads[sheet] then
|
||||
local sheetString = files.read_file(sheet)
|
||||
if not sheetString then
|
||||
error("Failed to load ".. sheet)
|
||||
end
|
||||
|
||||
local atlas = json.parse(sheetString).TextureAtlas.SubTexture
|
||||
|
||||
local quads = {}
|
||||
|
||||
local newSprite = setmetatable({
|
||||
image = love.graphics.newImage(image),
|
||||
quads = quads,
|
||||
elapsed = 0,
|
||||
fps = 10,
|
||||
animation = nil,
|
||||
frame = 0,
|
||||
position = module.Vector2(200, 100), -- changeable
|
||||
looping = false,
|
||||
extraOffset = module.Vector2(0,0),
|
||||
rect = false,
|
||||
modifier = 1
|
||||
}, Sprite)
|
||||
|
||||
for index, sprite in next, atlas do
|
||||
local x = sprite._x
|
||||
local y = sprite._y
|
||||
local width = sprite._width
|
||||
local height = sprite._height
|
||||
local frameX = sprite._frameX
|
||||
local frameY = sprite._frameY
|
||||
local frameW = sprite._frameWidth
|
||||
local frameH = sprite._frameHeight
|
||||
|
||||
local name = sprite._name
|
||||
|
||||
local num = tonumber(string.sub(name, name:len() - 3, name:len()))
|
||||
|
||||
if not quads[name:sub(0, name:len() - 4)] then
|
||||
quads[name:sub(0, name:len() - 4)] = {}
|
||||
end
|
||||
|
||||
quads[name:sub(0, name:len() - 4)][num] = {quad = love.graphics.newQuad(x, y, width, height, newSprite.image), offset = module.Vector2(frameX or 0, frameY or 0), resize = module.Vector2(1,1)}
|
||||
end
|
||||
|
||||
newSprite.quads = quads
|
||||
cachedQuads[sheet] = {quads = quads, image = newSprite.image}
|
||||
|
||||
Sprites[#Sprites+1] = newSprite
|
||||
|
||||
return newSprite
|
||||
else
|
||||
local newSprite = setmetatable({
|
||||
image = cachedQuads[sheet].image,
|
||||
quads = cachedQuads[sheet].quads,
|
||||
elapsed = 0,
|
||||
fps = 10,
|
||||
animation = nil,
|
||||
frame = 0,
|
||||
position = module.Vector2(200, 100), -- changeable
|
||||
looping = false,
|
||||
extraOffset = module.Vector2(0,0),
|
||||
rect = false,
|
||||
modifier = 1,
|
||||
allowedFrame = 0
|
||||
}, Sprite)
|
||||
|
||||
Sprites[#Sprites+1] = newSprite
|
||||
|
||||
return newSprite
|
||||
end
|
||||
end
|
||||
|
||||
function Sprite:PlayAnimation(name, fps, loop)
|
||||
self.animation = name
|
||||
self.fps = fps
|
||||
self.looping = loop
|
||||
self.frame = 1
|
||||
self.ended = false
|
||||
end
|
||||
|
||||
function Sprite:Destroy()
|
||||
if self.rect then
|
||||
for index, rect in next, Rects do
|
||||
if rect == self then
|
||||
Rects[index] = nil
|
||||
-- for name, animation in next, rect.quads do
|
||||
-- for index, quad in next, animation do
|
||||
-- quad:release()
|
||||
-- end
|
||||
-- end
|
||||
end
|
||||
end
|
||||
self = nil
|
||||
else
|
||||
for index, sprite in next, Sprites do
|
||||
if sprite == self then
|
||||
Sprites[index] = nil
|
||||
-- for name, animation in next, sprite.quads do
|
||||
-- for index, quad in next, animation do
|
||||
-- quad:release()
|
||||
-- end
|
||||
-- end
|
||||
end
|
||||
end
|
||||
self = nil
|
||||
end
|
||||
end
|
||||
|
||||
function Image:Destroy()
|
||||
for index, image in next, Images do
|
||||
if image == self then
|
||||
Images[index] = nil
|
||||
end
|
||||
end
|
||||
self = nil
|
||||
end
|
||||
|
||||
function module.updateSprites(dt)
|
||||
for index, sprite in next, Sprites do
|
||||
if not sprite.animation or not sprite.quads[sprite.animation] then goto continue end
|
||||
|
||||
sprite.elapsed = sprite.elapsed + dt
|
||||
|
||||
if sprite.elapsed > 1 / sprite.fps then
|
||||
if sprite.allowedFrames then
|
||||
sprite.frame = sprite.quads[sprite.animation][sprite.allowedFrames[sprite.allowedFrame + 1]] and sprite.allowedFrames[sprite.allowedFrame + 1] or sprite.looping and sprite.allowedFrames[1] or sprite.allowedFrames[sprite.allowedFrame]
|
||||
sprite.allowedFrame = sprite.allowedFrames[sprite.allowedFrame + 1] and sprite.allowedFrame + 1 or sprite.looping and 1 or #sprite.allowedFrames
|
||||
else
|
||||
sprite.frame = sprite.quads[sprite.animation][sprite.frame + 1] and sprite.frame + 1 or sprite.looping and 1 or sprite.frame
|
||||
end
|
||||
|
||||
if not sprite.quads[sprite.animation][sprite.frame + 1] and not sprite.looping then
|
||||
sprite.ended = true
|
||||
end
|
||||
|
||||
sprite.elapsed = 0
|
||||
end
|
||||
|
||||
-- sprite.quads[sprite.animation][sprite.frame].resize = module.Vector2(love.graphics.getWidth() / 1920, love.graphics.getHeight() / 1080)
|
||||
|
||||
::continue:: -- At the end. always.
|
||||
end
|
||||
|
||||
if not module.cameraPosition then
|
||||
module.cameraPosition = module.Vector2()
|
||||
end
|
||||
|
||||
module.cameraPosition = module.cameraPosition:Lerp(module.cameraTarget or module.Vector2(0,0), .2)
|
||||
end
|
||||
|
||||
function module.drawSprites()
|
||||
for index, image in next, Images do
|
||||
if not image.ui then
|
||||
local cameraOffset = module.cameraPosition
|
||||
love.graphics.draw(image.image, image.position.x + cameraOffset.x * image.modifier , image.position.y + cameraOffset.y * image.modifier, image.rotation, image.resize.x * (image.flipX and -1 or 1), image.resize.y * (image.flipY and -1 or 1))
|
||||
end
|
||||
end
|
||||
|
||||
for index, sprite in next, Sprites do
|
||||
if sprite.animation and sprite.quads and sprite.quads[sprite.animation] then
|
||||
local quad = sprite.quads[sprite.animation][sprite.frame] or sprite.quads[sprite.animation][0]
|
||||
if quad then
|
||||
if quad.offset.x == 0 and quad.offset.y == 0 and sprite.quads[sprite.animation][0].offset.x ~= 0 then
|
||||
quad.offset.x = sprite.quads[sprite.animation][0].offset.x
|
||||
quad.offset.y = sprite.quads[sprite.animation][0].offset.y
|
||||
end
|
||||
if sprite.flipX and not quad.flipped then
|
||||
quad.flipped = true
|
||||
quad.offset.x = -quad.offset.x
|
||||
end
|
||||
|
||||
local cameraOffset = sprite.ui and module.Vector2() or module.cameraPosition or module.Vector2()
|
||||
|
||||
love.graphics.draw(sprite.image, quad.quad, (sprite.position.x + (sprite.position.x - quad.offset.x - sprite.extraOffset.x) + cameraOffset.x * sprite.modifier), (sprite.position.y + (sprite.position.y - quad.offset.y - sprite.extraOffset.y) + cameraOffset.y * sprite.modifier), 0, quad.resize.x * (sprite.flipX and -1 or 1), quad.resize.y* (sprite.flipY and -1 or 1))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
for index, rect in next, Rects do
|
||||
if rect.animation then
|
||||
local quad = rect.quads[rect.animation][0]
|
||||
if rect.flipX and not quad.flipped then
|
||||
quad.flipped = true
|
||||
quad.offset.x = -quad.offset.x
|
||||
end
|
||||
|
||||
local cameraOffset = rect.ui and module.Vector2() or module.cameraPosition or module.Vector2()
|
||||
|
||||
love.graphics.draw(rect.image, quad.quad, (rect.position.x + (rect.position.x - quad.offset.x - rect.extraOffset.x) + cameraOffset.x * rect.modifier), (rect.position.y + (rect.position.y - quad.offset.y - rect.extraOffset.y) + cameraOffset.y * rect.modifier), 0, quad.resize.x * (rect.flipX and -1 or 1), quad.resize.y* (rect.flipY and -1 or 1))
|
||||
end
|
||||
end
|
||||
|
||||
for index, image in next, Images do
|
||||
if image.ui then
|
||||
local cameraOffset = image.ui and module.Vector2()
|
||||
|
||||
love.graphics.draw(image.image, (image.position.x) + cameraOffset.x, image.position.y + cameraOffset.y, image.rotation, image.resize.x * (image.flipX and -1 or 1), image.resize.y)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function module.Rect(image, sheet)
|
||||
if not cachedQuads[sheet] then
|
||||
local sheetString = files.read_file(sheet)
|
||||
|
||||
if not sheetString then
|
||||
error("Failed to load", sheet)
|
||||
end
|
||||
|
||||
local atlas = json.parse(sheetString).TextureAtlas.SubTexture
|
||||
|
||||
local quads = {}
|
||||
|
||||
local newSprite = setmetatable({
|
||||
image = love.graphics.newImage(image),
|
||||
quads = quads,
|
||||
elapsed = 0,
|
||||
fps = 10,
|
||||
animation = nil,
|
||||
frame = 0,
|
||||
position = module.Vector2(200, 100), -- changeable
|
||||
looping = false,
|
||||
extraOffset = module.Vector2(0,0),
|
||||
rect = false,
|
||||
modifier = 1
|
||||
}, Sprite)
|
||||
|
||||
for index, sprite in next, atlas do
|
||||
local x = sprite._x
|
||||
local y = sprite._y
|
||||
local width = sprite._width
|
||||
local height = sprite._height
|
||||
local frameX = sprite._frameX
|
||||
local frameY = sprite._frameY
|
||||
local frameW = sprite._frameWidth
|
||||
local frameH = sprite._frameHeight
|
||||
|
||||
local name = sprite._name
|
||||
|
||||
local num = tonumber(string.sub(name, name:len() - 3, name:len()))
|
||||
|
||||
if not quads[name:sub(0, name:len() - 4)] then
|
||||
quads[name:sub(0, name:len() - 4)] = {}
|
||||
end
|
||||
|
||||
quads[name:sub(0, name:len() - 4)][num] = {quad = love.graphics.newQuad(x, y, width, height, newSprite.image), offset = module.Vector2(frameX or 0, frameY or 0), resize = module.Vector2(1,1)}
|
||||
end
|
||||
|
||||
newSprite.quads = quads
|
||||
cachedQuads[sheet] = {quads = quads, image = newSprite.image}
|
||||
|
||||
Rects[#Rects+1] = newSprite
|
||||
|
||||
return newSprite
|
||||
else
|
||||
local newSprite = setmetatable({
|
||||
image = cachedQuads[sheet].image,
|
||||
quads = cachedQuads[sheet].quads,
|
||||
elapsed = 0,
|
||||
fps = 10,
|
||||
animation = nil,
|
||||
frame = 0,
|
||||
position = module.Vector2(200, 100), -- changeable
|
||||
looping = false,
|
||||
extraOffset = module.Vector2(0,0),
|
||||
rect = false,
|
||||
modifier = 1
|
||||
}, Sprite)
|
||||
|
||||
Sprites[#Sprites+1] = newSprite
|
||||
|
||||
return newSprite
|
||||
end
|
||||
end
|
||||
|
||||
function Sprite:Frame(name, frame)
|
||||
self.animation = name
|
||||
self.frame = frame
|
||||
end
|
||||
|
||||
function Sprite:StopAnimation()
|
||||
self.animation = nil
|
||||
self.frame = 0
|
||||
end
|
||||
local renderClasses = require("modules.types.render")
|
||||
local vectorClass = require("modules.types.vector")
|
||||
|
||||
noteclass.types = module
|
||||
module.note = noteclass.note
|
||||
@ -339,59 +11,17 @@ module.note = noteclass.note
|
||||
characterclass.myTypes = module
|
||||
module.character = characterclass.character
|
||||
|
||||
function module.destroyAllSprites()
|
||||
Sprites = {}
|
||||
Rects = {}
|
||||
Images = {}
|
||||
end
|
||||
renderClasses.myTypes = module
|
||||
module.Sprite = renderClasses.Sprite
|
||||
module.Rect = renderClasses.Rect
|
||||
module.Image = renderClasses.Image
|
||||
module.destroyAllSprites = renderClasses.destroyAllSprites
|
||||
module.drawSprites = renderClasses.drawSprites
|
||||
module.updateSprites = renderClasses.updateSprites
|
||||
|
||||
function module.Image(path, scrollFactor)
|
||||
local newImage = setmetatable({
|
||||
image = love.graphics.newImage(path),
|
||||
resize = module.Vector2(1,1),
|
||||
position = module.Vector2(),
|
||||
modifier = scrollFactor or 1,
|
||||
rotation = 0
|
||||
}, Image)
|
||||
module.Vector2 = vectorClass.Vector2
|
||||
|
||||
Images[#Images+1] = newImage
|
||||
module.render = renderClasses
|
||||
|
||||
return newImage
|
||||
end
|
||||
|
||||
function module.preLoad(imagePath, sheetPath)
|
||||
local sheetString = files.read_file(sheetPath)
|
||||
if not sheetString then
|
||||
error("Failed to load", sheetPath)
|
||||
end
|
||||
|
||||
local atlas = json.parse(sheetString).TextureAtlas.SubTexture
|
||||
|
||||
local quads = {}
|
||||
|
||||
local image = love.graphics.newImage(imagePath)
|
||||
|
||||
for index, sprite in next, atlas do
|
||||
local x = sprite._x
|
||||
local y = sprite._y
|
||||
local width = sprite._width
|
||||
local height = sprite._height
|
||||
local frameX = sprite._frameX
|
||||
local frameY = sprite._frameY
|
||||
local frameW = sprite._frameWidth
|
||||
local frameH = sprite._frameHeight
|
||||
|
||||
local name = sprite._name
|
||||
|
||||
local num = tonumber(string.sub(name, name:len() - 3, name:len()))
|
||||
|
||||
if not quads[name:sub(0, name:len() - 4)] then
|
||||
quads[name:sub(0, name:len() - 4)] = {}
|
||||
end
|
||||
quads[name:sub(0, name:len() - 4)][num] = {quad = love.graphics.newQuad(x, y, width, height, image), offset = module.Vector2(frameX or 0, frameY or 0), resize = module.Vector2(1,1)}
|
||||
end
|
||||
|
||||
cachedQuads[sheetPath] = {quads = quads, image = image}
|
||||
end
|
||||
|
||||
return module
|
||||
|
359
modules/types/render.lua
Normal file
@ -0,0 +1,359 @@
|
||||
local json = require("modules.json")
|
||||
local files = require("modules.files")
|
||||
|
||||
local module = {}
|
||||
|
||||
local Sprite = {}
|
||||
Sprite.__index = Sprite
|
||||
|
||||
local Image = {}
|
||||
Image.__index = Image
|
||||
|
||||
local cachedQuads = {}
|
||||
|
||||
local Sprites, Rects, Images = {}, {}, {}
|
||||
|
||||
function module.Sprite(image, sheet)
|
||||
if not cachedQuads[sheet] then
|
||||
local sheetString = files.read_file(sheet)
|
||||
if not sheetString then
|
||||
error("Failed to load ".. sheet)
|
||||
end
|
||||
|
||||
local atlas = json.parse(sheetString).TextureAtlas.SubTexture
|
||||
|
||||
local quads = {}
|
||||
|
||||
local newSprite = setmetatable({
|
||||
image = love.graphics.newImage(image),
|
||||
quads = quads,
|
||||
elapsed = 0,
|
||||
fps = 10,
|
||||
animation = nil,
|
||||
frame = 0,
|
||||
position = module.myTypes.Vector2(200, 100), -- changeable
|
||||
looping = false,
|
||||
extraOffset = module.myTypes.Vector2(0,0),
|
||||
rect = false,
|
||||
modifier = 1
|
||||
}, Sprite)
|
||||
|
||||
for index, sprite in next, atlas do
|
||||
local x = sprite._x
|
||||
local y = sprite._y
|
||||
local width = sprite._width
|
||||
local height = sprite._height
|
||||
local frameX = sprite._frameX
|
||||
local frameY = sprite._frameY
|
||||
local frameW = sprite._frameWidth
|
||||
local frameH = sprite._frameHeight
|
||||
|
||||
local name = sprite._name
|
||||
|
||||
local num = tonumber(string.sub(name, name:len() - 3, name:len()))
|
||||
|
||||
if not quads[name:sub(0, name:len() - 4)] then
|
||||
quads[name:sub(0, name:len() - 4)] = {}
|
||||
end
|
||||
|
||||
quads[name:sub(0, name:len() - 4)][num] = {quad = love.graphics.newQuad(x, y, width, height, newSprite.image), offset = module.myTypes.Vector2(frameX or 0, frameY or 0), resize = module.myTypes.Vector2(1,1)}
|
||||
end
|
||||
|
||||
newSprite.quads = quads
|
||||
cachedQuads[sheet] = {quads = quads, image = newSprite.image}
|
||||
|
||||
Sprites[#Sprites+1] = newSprite
|
||||
|
||||
return newSprite
|
||||
else
|
||||
local newSprite = setmetatable({
|
||||
image = cachedQuads[sheet].image,
|
||||
quads = cachedQuads[sheet].quads,
|
||||
elapsed = 0,
|
||||
fps = 10,
|
||||
animation = nil,
|
||||
frame = 0,
|
||||
position = module.myTypes.Vector2(200, 100), -- changeable
|
||||
looping = false,
|
||||
extraOffset = module.myTypes.Vector2(0,0),
|
||||
rect = false,
|
||||
modifier = 1,
|
||||
allowedFrame = 0
|
||||
}, Sprite)
|
||||
|
||||
Sprites[#Sprites+1] = newSprite
|
||||
|
||||
return newSprite
|
||||
end
|
||||
end
|
||||
|
||||
function Sprite:PlayAnimation(name, fps, loop)
|
||||
self.animation = name
|
||||
self.fps = fps
|
||||
self.looping = loop
|
||||
self.frame = 1
|
||||
self.ended = false
|
||||
end
|
||||
|
||||
function Sprite:Destroy()
|
||||
if self.rect then
|
||||
for index, rect in next, Rects do
|
||||
if rect == self then
|
||||
Rects[index] = nil
|
||||
-- for name, animation in next, rect.quads do
|
||||
-- for index, quad in next, animation do
|
||||
-- quad:release()
|
||||
-- end
|
||||
-- end
|
||||
end
|
||||
end
|
||||
self = nil
|
||||
else
|
||||
for index, sprite in next, Sprites do
|
||||
if sprite == self then
|
||||
Sprites[index] = nil
|
||||
-- for name, animation in next, sprite.quads do
|
||||
-- for index, quad in next, animation do
|
||||
-- quad:release()
|
||||
-- end
|
||||
-- end
|
||||
end
|
||||
end
|
||||
self = nil
|
||||
end
|
||||
end
|
||||
|
||||
function Image:Destroy()
|
||||
for index, image in next, Images do
|
||||
if image == self then
|
||||
Images[index] = nil
|
||||
end
|
||||
end
|
||||
self = nil
|
||||
end
|
||||
|
||||
function module.updateSprites(dt)
|
||||
for index, sprite in next, Sprites do
|
||||
if not sprite.animation or not sprite.quads[sprite.animation] then goto continue end
|
||||
|
||||
sprite.elapsed = sprite.elapsed + dt
|
||||
|
||||
if sprite.elapsed > 1 / sprite.fps then
|
||||
if sprite.allowedFrames then
|
||||
sprite.frame = sprite.quads[sprite.animation][sprite.allowedFrames[sprite.allowedFrame + 1]] and sprite.allowedFrames[sprite.allowedFrame + 1] or sprite.looping and sprite.allowedFrames[1] or sprite.allowedFrames[sprite.allowedFrame]
|
||||
sprite.allowedFrame = sprite.allowedFrames[sprite.allowedFrame + 1] and sprite.allowedFrame + 1 or sprite.looping and 1 or #sprite.allowedFrames
|
||||
else
|
||||
sprite.frame = sprite.quads[sprite.animation][sprite.frame + 1] and sprite.frame + 1 or sprite.looping and 1 or sprite.frame
|
||||
end
|
||||
|
||||
if not sprite.quads[sprite.animation][sprite.frame + 1] and not sprite.looping then
|
||||
sprite.ended = true
|
||||
end
|
||||
|
||||
sprite.elapsed = 0
|
||||
end
|
||||
|
||||
-- sprite.quads[sprite.animation][sprite.frame].resize = module.myTypes.Vector2(love.graphics.getWidth() / 1920, love.graphics.getHeight() / 1080)
|
||||
|
||||
::continue:: -- At the end. always.
|
||||
end
|
||||
|
||||
if not module.cameraPosition then
|
||||
module.cameraPosition = module.myTypes.Vector2()
|
||||
end
|
||||
|
||||
module.cameraPosition = module.cameraPosition:Lerp(module.cameraTarget or module.myTypes.Vector2(0,0), .2)
|
||||
end
|
||||
|
||||
function module.drawSprites()
|
||||
for index, image in next, Images do
|
||||
if not image.ui then
|
||||
local cameraOffset = module.cameraPosition
|
||||
love.graphics.draw(image.image, image.position.x + cameraOffset.x * image.modifier , image.position.y + cameraOffset.y * image.modifier, image.rotation, image.resize.x * (image.flipX and -1 or 1), image.resize.y * (image.flipY and -1 or 1))
|
||||
end
|
||||
end
|
||||
|
||||
for index, sprite in next, Sprites do
|
||||
if sprite.animation and sprite.quads and sprite.quads[sprite.animation] then
|
||||
local quad = sprite.quads[sprite.animation][sprite.frame] or sprite.quads[sprite.animation][0]
|
||||
if quad then
|
||||
if quad.offset.x == 0 and quad.offset.y == 0 and sprite.quads[sprite.animation][0].offset.x ~= 0 then
|
||||
quad.offset.x = sprite.quads[sprite.animation][0].offset.x
|
||||
quad.offset.y = sprite.quads[sprite.animation][0].offset.y
|
||||
end
|
||||
if sprite.flipX and not quad.flipped then
|
||||
quad.flipped = true
|
||||
quad.offset.x = -quad.offset.x
|
||||
end
|
||||
|
||||
local cameraOffset = sprite.ui and module.myTypes.Vector2() or module.cameraPosition or module.myTypes.Vector2()
|
||||
|
||||
love.graphics.draw(sprite.image, quad.quad, (sprite.position.x + (sprite.position.x - quad.offset.x - sprite.extraOffset.x) + cameraOffset.x * sprite.modifier), (sprite.position.y + (sprite.position.y - quad.offset.y - sprite.extraOffset.y) + cameraOffset.y * sprite.modifier), 0, quad.resize.x * (sprite.flipX and -1 or 1), quad.resize.y* (sprite.flipY and -1 or 1))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
for index, rect in next, Rects do
|
||||
if rect.animation then
|
||||
local quad = rect.quads[rect.animation][0]
|
||||
if rect.flipX and not quad.flipped then
|
||||
quad.flipped = true
|
||||
quad.offset.x = -quad.offset.x
|
||||
end
|
||||
|
||||
local cameraOffset = rect.ui and module.myTypes.Vector2() or module.cameraPosition or module.myTypes.Vector2()
|
||||
|
||||
love.graphics.draw(rect.image, quad.quad, (rect.position.x + (rect.position.x - quad.offset.x - rect.extraOffset.x) + cameraOffset.x * rect.modifier), (rect.position.y + (rect.position.y - quad.offset.y - rect.extraOffset.y) + cameraOffset.y * rect.modifier), 0, quad.resize.x * (rect.flipX and -1 or 1), quad.resize.y* (rect.flipY and -1 or 1))
|
||||
end
|
||||
end
|
||||
|
||||
for index, image in next, Images do
|
||||
if image.ui then
|
||||
local cameraOffset = image.ui and module.myTypes.Vector2()
|
||||
|
||||
love.graphics.draw(image.image, (image.position.x) + cameraOffset.x, image.position.y + cameraOffset.y, image.rotation, image.resize.x * (image.flipX and -1 or 1), image.resize.y)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function module.Rect(image, sheet)
|
||||
if not cachedQuads[sheet] then
|
||||
local sheetString = files.read_file(sheet)
|
||||
|
||||
if not sheetString then
|
||||
error("Failed to load", sheet)
|
||||
end
|
||||
|
||||
local atlas = json.parse(sheetString).TextureAtlas.SubTexture
|
||||
|
||||
local quads = {}
|
||||
|
||||
local newSprite = setmetatable({
|
||||
image = love.graphics.newImage(image),
|
||||
quads = quads,
|
||||
elapsed = 0,
|
||||
fps = 10,
|
||||
animation = nil,
|
||||
frame = 0,
|
||||
position = module.myTypes.Vector2(200, 100), -- changeable
|
||||
looping = false,
|
||||
extraOffset = module.myTypes.Vector2(0,0),
|
||||
rect = false,
|
||||
modifier = 1
|
||||
}, Sprite)
|
||||
|
||||
for index, sprite in next, atlas do
|
||||
local x = sprite._x
|
||||
local y = sprite._y
|
||||
local width = sprite._width
|
||||
local height = sprite._height
|
||||
local frameX = sprite._frameX
|
||||
local frameY = sprite._frameY
|
||||
local frameW = sprite._frameWidth
|
||||
local frameH = sprite._frameHeight
|
||||
|
||||
local name = sprite._name
|
||||
|
||||
local num = tonumber(string.sub(name, name:len() - 3, name:len()))
|
||||
|
||||
if not quads[name:sub(0, name:len() - 4)] then
|
||||
quads[name:sub(0, name:len() - 4)] = {}
|
||||
end
|
||||
|
||||
quads[name:sub(0, name:len() - 4)][num] = {quad = love.graphics.newQuad(x, y, width, height, newSprite.image), offset = module.myTypes.Vector2(frameX or 0, frameY or 0), resize = module.myTypes.Vector2(1,1)}
|
||||
end
|
||||
|
||||
newSprite.quads = quads
|
||||
cachedQuads[sheet] = {quads = quads, image = newSprite.image}
|
||||
|
||||
Rects[#Rects+1] = newSprite
|
||||
|
||||
return newSprite
|
||||
else
|
||||
local newSprite = setmetatable({
|
||||
image = cachedQuads[sheet].image,
|
||||
quads = cachedQuads[sheet].quads,
|
||||
elapsed = 0,
|
||||
fps = 10,
|
||||
animation = nil,
|
||||
frame = 0,
|
||||
position = module.myTypes.Vector2(200, 100), -- changeable
|
||||
looping = false,
|
||||
extraOffset = module.myTypes.Vector2(0,0),
|
||||
rect = false,
|
||||
modifier = 1
|
||||
}, Sprite)
|
||||
|
||||
Sprites[#Sprites+1] = newSprite
|
||||
|
||||
return newSprite
|
||||
end
|
||||
end
|
||||
|
||||
function Sprite:Frame(name, frame)
|
||||
self.animation = name
|
||||
self.frame = frame
|
||||
end
|
||||
|
||||
function Sprite:StopAnimation()
|
||||
self.animation = nil
|
||||
self.frame = 0
|
||||
end
|
||||
|
||||
|
||||
function module.destroyAllSprites()
|
||||
Sprites = {}
|
||||
Rects = {}
|
||||
Images = {}
|
||||
end
|
||||
|
||||
function module.Image(path, scrollFactor)
|
||||
local newImage = setmetatable({
|
||||
image = love.graphics.newImage(path),
|
||||
resize = module.myTypes.Vector2(1,1),
|
||||
position = module.myTypes.Vector2(),
|
||||
modifier = scrollFactor or 1,
|
||||
rotation = 0
|
||||
}, Image)
|
||||
|
||||
Images[#Images+1] = newImage
|
||||
|
||||
return newImage
|
||||
end
|
||||
|
||||
function module.preLoad(imagePath, sheetPath)
|
||||
local sheetString = files.read_file(sheetPath)
|
||||
if not sheetString then
|
||||
error("Failed to load", sheetPath)
|
||||
end
|
||||
|
||||
local atlas = json.parse(sheetString).TextureAtlas.SubTexture
|
||||
|
||||
local quads = {}
|
||||
|
||||
local image = love.graphics.newImage(imagePath)
|
||||
|
||||
for index, sprite in next, atlas do
|
||||
local x = sprite._x
|
||||
local y = sprite._y
|
||||
local width = sprite._width
|
||||
local height = sprite._height
|
||||
local frameX = sprite._frameX
|
||||
local frameY = sprite._frameY
|
||||
local frameW = sprite._frameWidth
|
||||
local frameH = sprite._frameHeight
|
||||
|
||||
local name = sprite._name
|
||||
|
||||
local num = tonumber(string.sub(name, name:len() - 3, name:len()))
|
||||
|
||||
if not quads[name:sub(0, name:len() - 4)] then
|
||||
quads[name:sub(0, name:len() - 4)] = {}
|
||||
end
|
||||
quads[name:sub(0, name:len() - 4)][num] = {quad = love.graphics.newQuad(x, y, width, height, image), offset = module.myTypes.Vector2(frameX or 0, frameY or 0), resize = module.myTypes.Vector2(1,1)}
|
||||
end
|
||||
|
||||
cachedQuads[sheetPath] = {quads = quads, image = image}
|
||||
end
|
||||
|
||||
return module
|
32
modules/types/vector.lua
Normal file
@ -0,0 +1,32 @@
|
||||
local myMath = require("modules.math")
|
||||
|
||||
local module = {}
|
||||
|
||||
local Vector2 = {}
|
||||
Vector2.__index = Vector2
|
||||
|
||||
function Vector2:Lerp(newVector2, position)
|
||||
return module.Vector2(myMath.lerp(self.x, newVector2.x, position), myMath.lerp(self.y, newVector2.y, position))
|
||||
end
|
||||
|
||||
function Vector2:Get()
|
||||
return self.x, self.y
|
||||
end
|
||||
|
||||
function Vector2:Negate()
|
||||
return module.Vector2(-self.x, -self.y)
|
||||
end
|
||||
|
||||
function Vector2:Add(addVector2)
|
||||
return module.Vector2(self.x + addVector2.x, self.y + addVector2.y)
|
||||
end
|
||||
|
||||
function Vector2:Mul(num)
|
||||
return module.Vector2(self.x * num, self.y * num)
|
||||
end
|
||||
|
||||
function module.Vector2(x, y)
|
||||
return setmetatable({x = x or 0, y = y or 0}, Vector2)
|
||||
end
|
||||
|
||||
return module
|
@ -1 +1 @@
|
||||
{"Downscroll":true, "Keybinds":["a", "s", "up", "right"]}
|
||||
{"Downscroll":false, "Keybinds":["a", "s", "up", "right"]}
|
95
sprites/stage/erect/crowd.json
Normal file
@ -0,0 +1,95 @@
|
||||
{
|
||||
"TextureAtlas": {
|
||||
"SubTexture": [
|
||||
{
|
||||
"_name": "Symbol 2 instance 10000",
|
||||
"_x": "0",
|
||||
"_y": "0",
|
||||
"_width": "1330",
|
||||
"_height": "395",
|
||||
"_frameX": "0",
|
||||
"_frameY": "-3",
|
||||
"_frameWidth": "1334",
|
||||
"_frameHeight": "401"
|
||||
},
|
||||
{
|
||||
"_name": "Symbol 2 instance 10001",
|
||||
"_x": "1335",
|
||||
"_y": "0",
|
||||
"_width": "1320",
|
||||
"_height": "389",
|
||||
"_frameX": "-10",
|
||||
"_frameY": "-9",
|
||||
"_frameWidth": "1334",
|
||||
"_frameHeight": "401"
|
||||
},
|
||||
{
|
||||
"_name": "Symbol 2 instance 10002",
|
||||
"_x": "2660",
|
||||
"_y": "0",
|
||||
"_width": "1321",
|
||||
"_height": "390",
|
||||
"_frameX": "-10",
|
||||
"_frameY": "-9",
|
||||
"_frameWidth": "1334",
|
||||
"_frameHeight": "401"
|
||||
},
|
||||
{
|
||||
"_name": "Symbol 2 instance 10003",
|
||||
"_x": "0",
|
||||
"_y": "400",
|
||||
"_width": "1329",
|
||||
"_height": "384",
|
||||
"_frameX": "-2",
|
||||
"_frameY": "-15",
|
||||
"_frameWidth": "1334",
|
||||
"_frameHeight": "401"
|
||||
},
|
||||
{
|
||||
"_name": "Symbol 2 instance 10004",
|
||||
"_x": "1334",
|
||||
"_y": "400",
|
||||
"_width": "1326",
|
||||
"_height": "384",
|
||||
"_frameX": "-2",
|
||||
"_frameY": "-15",
|
||||
"_frameWidth": "1334",
|
||||
"_frameHeight": "401"
|
||||
},
|
||||
{
|
||||
"_name": "Symbol 2 instance 10005",
|
||||
"_x": "2665",
|
||||
"_y": "400",
|
||||
"_width": "1324",
|
||||
"_height": "399",
|
||||
"_frameX": "-4",
|
||||
"_frameY": "0",
|
||||
"_frameWidth": "1334",
|
||||
"_frameHeight": "401"
|
||||
},
|
||||
{
|
||||
"_name": "Symbol 2 instance 10006",
|
||||
"_x": "0",
|
||||
"_y": "804",
|
||||
"_width": "1330",
|
||||
"_height": "401",
|
||||
"_frameX": "-4",
|
||||
"_frameY": "0",
|
||||
"_frameWidth": "1334",
|
||||
"_frameHeight": "401"
|
||||
},
|
||||
{
|
||||
"_name": "Symbol 2 instance 10007",
|
||||
"_x": "1335",
|
||||
"_y": "804",
|
||||
"_width": "1334",
|
||||
"_height": "398",
|
||||
"_frameX": "0",
|
||||
"_frameY": "-3",
|
||||
"_frameWidth": "1334",
|
||||
"_frameHeight": "401"
|
||||
}
|
||||
],
|
||||
"_imagePath": "crowd.png"
|
||||
}
|
||||
}
|
BIN
sprites/stage/erect/crowd.png
Normal file
After Width: | Height: | Size: 401 KiB |
15
stages/stageErect.json
Normal file
@ -0,0 +1,15 @@
|
||||
{
|
||||
"directory": "",
|
||||
"defaultZoom": 0.85,
|
||||
"isPixelStage": false,
|
||||
|
||||
"boyfriend": [977, -160],
|
||||
"girlfriend": [501, -200],
|
||||
"opponent": [200, -175],
|
||||
"hide_girlfriend": false,
|
||||
|
||||
"camera_boyfriend": [150, -300],
|
||||
"camera_opponent": [-300, 300],
|
||||
"camera_girlfriend": [0, 0],
|
||||
"camera_speed": 1
|
||||
}
|
39
stages/stageErect.lua
Normal file
@ -0,0 +1,39 @@
|
||||
local myTypes = require("modules.types")
|
||||
|
||||
return {
|
||||
onCreate = function(song)
|
||||
local backDark = myTypes.Image("images/stage/erect/backDark.png")
|
||||
backDark.position = myTypes.Vector2(729, -170)
|
||||
|
||||
local crowd = myTypes.Sprite("sprites/stage/erect/crowd.png", "sprites/stage/erect/crowd.json")
|
||||
crowd:PlayAnimation("Symbol 2 instance 1", 24, true)
|
||||
crowd.position = myTypes.Vector2(560, 150)
|
||||
crowd.modifier = 0.8
|
||||
|
||||
local brightLightSmall = myTypes.Image("images/stage/erect/brightLightSmall.png")
|
||||
brightLightSmall.position = myTypes.Vector2(967, -103)
|
||||
brightLightSmall.modifier = 1.2
|
||||
|
||||
local bg = myTypes.Image("images/stage/erect/bg.png")
|
||||
bg.position = myTypes.Vector2(-603, -187)
|
||||
|
||||
local server = myTypes.Image("images/stage/erect/server.png")
|
||||
server.position = myTypes.Vector2(-361, 205)
|
||||
|
||||
local lightGreen = myTypes.Image("images/stage/erect/lightgreen.png")
|
||||
lightGreen.position = myTypes.Vector2(-171, 242)
|
||||
|
||||
local lightRed = myTypes.Image("images/stage/erect/lightred.png")
|
||||
lightRed.position = myTypes.Vector2(-101, 560)
|
||||
|
||||
local lightOrange = myTypes.Image("images/stage/erect/orangeLight.png")
|
||||
lightOrange.position = myTypes.Vector2(189, -195)
|
||||
|
||||
local lights = myTypes.Image("images/stage/erect/lights.png")
|
||||
lights.position = myTypes.Vector2(-601, -147)
|
||||
lights.modifier = 1.2
|
||||
|
||||
local lightAbove = myTypes.Image("images/stage/erect/lightAbove.png")
|
||||
lights.position = myTypes.Vector2(804, -117)
|
||||
end
|
||||
}
|