2022-03-08 08:13:53 +00:00
package funkin . charting ;
2020-10-10 02:39:52 +00:00
2020-10-10 09:28:44 +00:00
import flixel . FlxSprite ;
2020-10-13 05:18:50 +00:00
import flixel . addons . display . FlxGridOverlay ;
2022-01-26 02:14:31 +00:00
import flixel . addons . transition . FlxTransitionableState ;
2020-10-14 08:18:19 +00:00
import flixel . addons . ui . FlxInputText ;
import flixel . addons . ui . FlxUI ;
2020-10-12 03:52:21 +00:00
import flixel . addons . ui . FlxUICheckBox ;
2020-10-19 00:59:53 +00:00
import flixel . addons . ui . FlxUIDropDownMenu ;
2020-10-14 08:18:19 +00:00
import flixel . addons . ui . FlxUIInputText ;
2020-10-16 04:22:13 +00:00
import flixel . addons . ui . FlxUINumericStepper ;
2020-10-14 08:18:19 +00:00
import flixel . addons . ui . FlxUITabMenu ;
2020-10-12 03:52:21 +00:00
import flixel . group . FlxGroup ;
2020-10-13 05:18:50 +00:00
import flixel . math . FlxMath ;
2022-01-26 04:11:43 +00:00
import flixel . system . FlxSound ;
2020-10-10 09:28:44 +00:00
import flixel . text . FlxText ;
2020-10-10 03:22:07 +00:00
import flixel . ui . FlxButton ;
2020-10-10 04:22:26 +00:00
import flixel . util . FlxColor ;
2022-04-18 23:36:09 +00:00
import funkin . Conductor . BPMChangeEvent ;
import funkin . Note . NoteData ;
import funkin . Section . SwagSection ;
import funkin . SongLoad . SwagSong ;
import funkin . audiovis . ABotVis ;
import funkin . audiovis . PolygonSpectogram ;
import funkin . audiovis . SpectogramSprite ;
2022-04-19 00:39:41 +00:00
import funkin . play . HealthIcon ;
2022-04-18 23:36:09 +00:00
import funkin . play . PlayState ;
import funkin . rendering . MeshRender ;
2020-10-10 03:22:07 +00:00
import haxe . Json ;
2021-09-06 18:50:04 +00:00
import lime . media . AudioBuffer ;
2021-01-04 23:56:30 +00:00
import lime . utils . Assets ;
2020-10-10 03:22:07 +00:00
import openfl . events . Event ;
import openfl . events . IOErrorEvent ;
import openfl . net . FileReference ;
2020-10-10 02:39:52 +00:00
2021-09-28 02:30:38 +00:00
using Lambda ;
2020-10-13 08:07:04 +00:00
using StringTools ;
2021-12-06 22:49:05 +00:00
using flixel . util . FlxSpriteUtil ; // add in "compiler save" that saves the JSON directly to the debug json using File.write() stuff on windows / sys
2020-10-13 08:07:04 +00:00
2020-10-10 03:22:07 +00:00
class ChartingState extends MusicBeatState
2020-10-10 02:39:52 +00:00
{
2020-10-10 03:22:07 +00:00
var _file: FileReference ;
2020-10-12 00:24:34 +00:00
2020-10-14 08:18:19 +00:00
var UI_box: FlxUITabMenu ;
2022-02-04 00:13:39 +00:00
var sidePreview: FlxSprite ;
2020-10-12 03:52:21 +00:00
2020-10-12 00:24:34 +00:00
/ * *
2020-10-12 02:05:26 +00:00
* Array of notes showing when each section STARTS in STEPS
* Usually rounded up ? ?
2020-10-12 00:24:34 +00:00
* /
2020-10-13 08:07:04 +00:00
var curSection: Int = 0 ;
2021-01-14 03:38:31 +00:00
public static var lastSection: Int = 0 ;
2020-10-10 09:28:44 +00:00
var bpmTxt: FlxText ;
var strumLine: FlxSprite ;
2020-10-18 07:27:39 +00:00
var curSong: String = ' D a d b a t t l e ' ;
2020-10-12 00:24:34 +00:00
var amountSteps: Int = 0 ;
2020-10-12 03:52:21 +00:00
var bullshitUI: FlxGroup ;
var highlight: FlxSprite ;
2020-10-13 05:18:50 +00:00
2020-10-13 08:07:04 +00:00
var GRID_SIZE: Int = 40 ;
2020-10-13 05:18:50 +00:00
var dummyArrow: FlxSprite ;
2020-10-13 08:07:04 +00:00
var curRenderedNotes: FlxTypedGroup < Note > ;
2020-10-19 02:34:21 +00:00
var curRenderedSustains: FlxTypedGroup < FlxSprite > ;
2020-10-13 08:07:04 +00:00
2020-10-13 05:18:50 +00:00
var gridBG: FlxSprite ;
2020-10-10 03:22:07 +00:00
2020-10-24 09:19:13 +00:00
var _song: SwagSong ;
2020-10-14 01:44:07 +00:00
2020-10-14 08:18:19 +00:00
var typingShit: FlxInputText ;
2020-10-19 02:51:01 +00:00
/ *
* WILL BE THE CURRENT / LAST PLACED NOTE
* * /
2022-01-22 21:53:38 +00:00
var curSelectedNote: NoteData ;
2020-10-16 11:03:10 +00:00
2021-03-20 16:33:29 +00:00
var tempBpm: Float = 0 ;
2020-10-30 03:06:52 +00:00
2021-09-20 15:32:35 +00:00
var vocals: VoicesGroup ;
2020-10-31 04:25:23 +00:00
2021-01-17 04:15:29 +00:00
var leftIcon: HealthIcon ;
var rightIcon: HealthIcon ;
2021-09-06 18:50:04 +00:00
var audioBuf: AudioBuffer = new AudioBuffer ( ) ;
var playheadTest: FlxSprite ;
2022-02-12 02:39:43 +00:00
var staticSpecGrp: FlxTypedGroup < SpectogramSprite > ;
2021-09-20 17:21:25 +00:00
2020-10-10 02:39:52 +00:00
override function create ( )
{
2021-01-14 03:38:31 +00:00
curSection = lastSection ;
2021-09-06 18:50:04 +00:00
// sys.io.File.saveContent('./bitShit.txt', "swag");
2021-09-16 18:50:02 +00:00
// trace(audioBuf.sampleRate);
2021-09-06 18:50:04 +00:00
2020-10-13 05:18:50 +00:00
gridBG = FlxGridOverlay . create ( GRID_SIZE , GRID_SIZE , GRID_SIZE * 8 , GRID_SIZE * 16 ) ;
2022-02-09 19:00:04 +00:00
trace ( " G R D B G : " + gridBG . height ) ;
2020-10-13 05:18:50 +00:00
add ( gridBG ) ;
2021-01-17 04:15:29 +00:00
leftIcon = new HealthIcon ( ' b f ' ) ;
rightIcon = new HealthIcon ( ' d a d ' ) ;
leftIcon . scrollFactor . set ( 1 , 1 ) ;
rightIcon . scrollFactor . set ( 1 , 1 ) ;
leftIcon . setGraphicSize ( 0 , 45 ) ;
rightIcon . setGraphicSize ( 0 , 45 ) ;
add ( leftIcon ) ;
add ( rightIcon ) ;
leftIcon . setPosition ( 0 , - 100 ) ;
rightIcon . setPosition ( gridBG . width / 2 , - 100 ) ;
2021-01-07 03:38:17 +00:00
var gridBlackLine: FlxSprite = new FlxSprite ( gridBG . x + gridBG . width / 2 ) . makeGraphic ( 2 , Std . int ( gridBG . height ) , FlxColor . BLACK ) ;
add ( gridBlackLine ) ;
2020-10-13 08:07:04 +00:00
curRenderedNotes = new FlxTypedGroup < Note > ( ) ;
2020-10-19 02:34:21 +00:00
curRenderedSustains = new FlxTypedGroup < FlxSprite > ( ) ;
2020-10-13 08:07:04 +00:00
2022-03-11 06:30:01 +00:00
if ( PlayState . currentSong != null )
2022-01-25 18:30:08 +00:00
{
2022-03-11 06:30:01 +00:00
_song = SongLoad . songData = PlayState . currentSong ;
2022-01-25 18:30:08 +00:00
trace ( " L O A D E D A P L A Y S T A T E S O N G F I L E " ) ;
}
2020-10-14 01:44:07 +00:00
e lse
{
2022-01-21 03:55:19 +00:00
_song = SongLoad . songData = SongLoad . getDefaultSwagSong ( ) ;
2020-10-14 01:44:07 +00:00
}
2020-12-25 09:09:14 +00:00
FlxG . mouse . visible = true ;
FlxG . save . bind ( ' f u n k i n ' , ' n i n j a m u f f i n 9 9 ' ) ;
2020-10-30 03:06:52 +00:00
tempBpm = _song . bpm ;
2020-10-14 08:18:19 +00:00
addSection ( ) ;
2021-12-06 22:49:05 +00:00
// sections = SongLoad.getSong();
2020-10-14 01:44:07 +00:00
updateGrid ( ) ;
2020-10-14 08:30:54 +00:00
loadSong ( _song . song ) ;
2022-03-30 01:56:04 +00:00
Conductor . bpm = _song . bpm ;
2021-02-11 22:13:50 +00:00
Conductor . mapBPMChanges ( _song ) ;
2020-10-10 09:28:44 +00:00
2020-10-16 11:03:10 +00:00
bpmTxt = new FlxText ( 1000 , 50 , 0 , " " , 16 ) ;
bpmTxt . scrollFactor . set ( ) ;
2020-10-10 09:28:44 +00:00
add ( bpmTxt ) ;
2021-09-20 17:21:25 +00:00
strumLine = new FlxSprite ( 0 , 50 ) . makeGraphic ( Std . int ( GRID_SIZE * 8 ) , 4 ) ;
2020-10-10 09:28:44 +00:00
add ( strumLine ) ;
2022-01-21 04:33:51 +00:00
dummyArrow = new FlxSprite ( ) . makeGraphic ( GRID_SIZE , GRID_SIZE , 0xFFCC2288 ) ;
dummyArrow . alpha = 0.3 ;
2020-10-13 05:18:50 +00:00
add ( dummyArrow ) ;
2020-10-14 08:18:19 +00:00
var tabs = [
{ name : " S o n g " , label : ' S o n g ' } ,
{ name : " S e c t i o n " , label : ' S e c t i o n ' } ,
{ name : " N o t e " , label : ' N o t e ' }
] ;
UI_box = new FlxUITabMenu ( null , tabs , true ) ;
UI_box . resize ( 300 , 400 ) ;
2021-09-20 17:21:25 +00:00
UI_box . x = ( FlxG . width / 4 ) * 3 ;
UI_box . y = 120 ;
2020-10-14 08:18:19 +00:00
add ( UI_box ) ;
2020-10-16 04:22:13 +00:00
addSongUI ( ) ;
addSectionUI ( ) ;
2020-10-19 04:01:09 +00:00
addNoteUI ( ) ;
2020-10-16 04:22:13 +00:00
add ( curRenderedNotes ) ;
2020-10-19 02:34:21 +00:00
add ( curRenderedSustains ) ;
2020-10-16 04:22:13 +00:00
2021-03-20 16:33:29 +00:00
changeSection ( ) ;
2020-10-16 04:22:13 +00:00
super . create ( ) ;
}
function addSongUI ( ) : Void
{
2020-10-14 08:30:54 +00:00
var UI_songTitle = new FlxUIInputText ( 10 , 10 , 70 , _song . song , 8 ) ;
2020-10-14 08:18:19 +00:00
typingShit = UI_songTitle ;
var check_voices = new FlxUICheckBox ( 10 , 25 , null , null , " H a s v o i c e t r a c k " , 100 ) ;
2021-01-20 02:09:47 +00:00
check_voices . checked = _song . needsVoices ;
// _song.needsVoices = check_voices.checked;
2020-10-14 08:18:19 +00:00
check_voices . callback = function ( )
{
2020-10-14 08:30:54 +00:00
_song . needsVoices = check_voices . checked ;
2020-10-14 08:18:19 +00:00
trace ( ' C H E C K E D ! ' ) ;
} ;
2021-01-14 03:38:31 +00:00
var check_mute_inst = new FlxUICheckBox ( 10 , 200 , null , null , " M u t e I n s t r u m e n t a l ( i n e d i t o r ) " , 100 ) ;
check_mute_inst . checked = false ;
check_mute_inst . callback = function ( )
{
var vol: Float = 1 ;
if ( check_mute_inst . checked )
vol = 0 ;
FlxG . sound . music . volume = vol ;
} ;
2020-10-14 08:18:19 +00:00
var saveButton: FlxButton = new FlxButton ( 110 , 8 , " S a v e " , function ( )
{
saveLevel ( ) ;
} ) ;
2021-09-02 22:51:08 +00:00
var saveCompiler: FlxButton = new FlxButton ( 110 , 30 , " S a v e c o m p i l e " , function ( )
{
saveLevel ( true ) ;
} ) ;
2020-10-14 08:18:19 +00:00
var reloadSong: FlxButton = new FlxButton ( saveButton . x + saveButton . width + 10 , saveButton . y , " R e l o a d A u d i o " , function ( )
{
2020-10-14 08:30:54 +00:00
loadSong ( _song . song ) ;
2020-10-14 08:18:19 +00:00
} ) ;
2020-10-18 01:47:59 +00:00
var reloadSongJson: FlxButton = new FlxButton ( reloadSong . x , saveButton . y + 30 , " R e l o a d J S O N " , function ( )
{
2022-01-26 02:14:31 +00:00
FlxTransitionableState . skipNextTransIn = true ;
FlxTransitionableState . skipNextTransOut = true ;
2020-10-18 01:47:59 +00:00
loadJson ( _song . song . toLowerCase ( ) ) ;
} ) ;
2020-12-25 23:24:20 +00:00
var loadAutosaveBtn: FlxButton = new FlxButton ( reloadSongJson . x , reloadSongJson . y + 30 , ' l o a d a u t o s a v e ' , loadAutosave ) ;
2020-12-25 09:09:14 +00:00
2021-03-20 16:33:29 +00:00
var stepperSpeed: FlxUINumericStepper = new FlxUINumericStepper ( 10 , 80 , 0.1 , 1 , 0.1 , 10 , 2 ) ;
2021-12-06 22:49:05 +00:00
stepperSpeed . value = SongLoad . getSpeed ( ) ;
// stepperSpeed.value = _song.speed[SongLoad.curDiff];
2020-10-18 01:47:59 +00:00
stepperSpeed . name = ' s o n g _ s p e e d ' ;
2021-03-20 16:33:29 +00:00
var stepperBPM: FlxUINumericStepper = new FlxUINumericStepper ( 10 , 65 , 1 , 100 , 1 , 999 , 3 ) ;
2020-10-18 01:47:59 +00:00
stepperBPM . value = Conductor . bpm ;
stepperBPM . name = ' s o n g _ b p m ' ;
2021-02-10 20:18:14 +00:00
var characters: Array < String > = CoolUtil . coolTextFile ( Paths . txt ( ' c h a r a c t e r L i s t ' ) ) ;
2020-10-19 00:59:53 +00:00
var player1DropDown = new FlxUIDropDownMenu ( 10 , 100 , FlxUIDropDownMenu . makeStrIdLabelArray ( characters , true ) , function ( character : String )
{
_song . player1 = characters [ Std . parseInt ( character ) ] ;
2021-03-20 16:33:29 +00:00
updateHeads ( ) ;
2020-10-19 00:59:53 +00:00
} ) ;
player1DropDown . selectedLabel = _song . player1 ;
var player2DropDown = new FlxUIDropDownMenu ( 140 , 100 , FlxUIDropDownMenu . makeStrIdLabelArray ( characters , true ) , function ( character : String )
{
_song . player2 = characters [ Std . parseInt ( character ) ] ;
2021-03-20 16:33:29 +00:00
updateHeads ( ) ;
2020-10-19 00:59:53 +00:00
} ) ;
player2DropDown . selectedLabel = _song . player2 ;
2022-02-03 15:32:29 +00:00
var difficultyDropDown = new FlxUIDropDownMenu ( 10 , 230 , FlxUIDropDownMenu . makeStrIdLabelArray ( _song . difficulties , true ) , function ( diff : String )
{
SongLoad . curDiff = _song . difficulties [ Std . parseInt ( diff ) ] ;
SongLoad . checkAndCreateNotemap ( SongLoad . curDiff ) ;
2022-02-03 15:39:07 +00:00
while ( SongLoad . getSong ( ) [ curSection ] == null )
addSection ( ) ;
updateGrid ( ) ;
2022-02-03 15:32:29 +00:00
} ) ;
difficultyDropDown . selectedLabel = SongLoad . curDiff ;
2022-02-04 17:04:59 +00:00
var difficultyAdder = new FlxUIInputText ( 130 , 230 , 100 , " " , 12 ) ;
var addDiff: FlxButton = new FlxButton ( 130 , 250 , " A d d D i f f i c u l t y " , function ( )
{
difficultyAdder . text = " " ;
// something to regenerate difficulties
} ) ;
2020-10-14 08:18:19 +00:00
var tab_group_song = new FlxUI ( null , UI_box ) ;
tab_group_song . name = " S o n g " ;
tab_group_song . add ( UI_songTitle ) ;
tab_group_song . add ( check_voices ) ;
2021-01-14 03:38:31 +00:00
tab_group_song . add ( check_mute_inst ) ;
2020-10-14 08:18:19 +00:00
tab_group_song . add ( saveButton ) ;
2021-09-02 22:51:08 +00:00
tab_group_song . add ( saveCompiler ) ;
2020-10-14 08:18:19 +00:00
tab_group_song . add ( reloadSong ) ;
2020-10-18 01:47:59 +00:00
tab_group_song . add ( reloadSongJson ) ;
2020-12-25 09:09:14 +00:00
tab_group_song . add ( loadAutosaveBtn ) ;
2020-10-18 01:47:59 +00:00
tab_group_song . add ( stepperBPM ) ;
tab_group_song . add ( stepperSpeed ) ;
2020-10-19 00:59:53 +00:00
tab_group_song . add ( player1DropDown ) ;
tab_group_song . add ( player2DropDown ) ;
2022-02-03 15:32:29 +00:00
tab_group_song . add ( difficultyDropDown ) ;
2022-02-04 17:04:59 +00:00
tab_group_song . add ( difficultyAdder ) ;
tab_group_song . add ( addDiff ) ;
2020-10-14 08:18:19 +00:00
UI_box . addGroup ( tab_group_song ) ;
2020-10-16 11:03:10 +00:00
UI_box . scrollFactor . set ( ) ;
2021-09-20 17:21:25 +00:00
FlxG . camera . focusOn ( gridBG . getGraphicMidpoint ( ) ) ;
2020-10-16 04:22:13 +00:00
}
2020-10-14 08:18:19 +00:00
2020-10-16 04:22:13 +00:00
var stepperLength: FlxUINumericStepper ;
var check_mustHitSection: FlxUICheckBox ;
2020-10-30 03:06:52 +00:00
var check_changeBPM: FlxUICheckBox ;
var stepperSectionBPM: FlxUINumericStepper ;
2021-01-16 20:14:56 +00:00
var check_altAnim: FlxUICheckBox ;
2020-10-13 08:07:04 +00:00
2020-10-16 04:22:13 +00:00
function addSectionUI ( ) : Void
{
var tab_group_section = new FlxUI ( null , UI_box ) ;
tab_group_section . name = ' S e c t i o n ' ;
stepperLength = new FlxUINumericStepper ( 10 , 10 , 4 , 0 , 0 , 999 , 0 ) ;
2021-12-06 22:49:05 +00:00
stepperLength . value = SongLoad . getSong ( ) [ curSection ] . lengthInSteps ;
2020-10-16 04:22:13 +00:00
stepperLength . name = " s e c t i o n _ l e n g t h " ;
2021-03-20 16:33:29 +00:00
stepperSectionBPM = new FlxUINumericStepper ( 10 , 80 , 1 , Conductor . bpm , 1 , 999 , 3 ) ;
2020-10-30 03:06:52 +00:00
stepperSectionBPM . value = Conductor . bpm ;
stepperSectionBPM . name = ' s e c t i o n _ b p m ' ;
2020-12-27 02:46:22 +00:00
var stepperCopy: FlxUINumericStepper = new FlxUINumericStepper ( 110 , 130 , 1 , 1 , - 999 , 999 , 0 ) ;
2020-10-18 01:47:59 +00:00
2020-12-27 02:46:22 +00:00
var copyButton: FlxButton = new FlxButton ( 10 , 130 , " C o p y l a s t s e c t i o n " , function ( )
2020-10-17 21:33:35 +00:00
{
2020-10-18 01:47:59 +00:00
copySection ( Std . int ( stepperCopy . value ) ) ;
2020-10-17 21:33:35 +00:00
} ) ;
2020-12-25 08:40:01 +00:00
var clearSectionButton: FlxButton = new FlxButton ( 10 , 150 , " C l e a r " , clearSection ) ;
var swapSection: FlxButton = new FlxButton ( 10 , 170 , " S w a p s e c t i o n " , function ( )
{
2021-12-06 22:49:05 +00:00
for ( i in 0 ... SongLoad . getSong ( ) [ curSection ] . sectionNotes . length )
2020-12-25 08:40:01 +00:00
{
2022-01-22 21:53:38 +00:00
var note: Note = new Note ( 0 , 0 ) ;
note . data = SongLoad . getSong ( ) [ curSection ] . sectionNotes [ i ] ;
2022-01-22 21:57:49 +00:00
note . data . noteData = ( note . data . noteData + 4 ) % 8 ;
2022-01-22 21:53:38 +00:00
SongLoad . getSong ( ) [ curSection ] . sectionNotes [ i ] = note . data ;
2020-12-25 08:40:01 +00:00
updateGrid ( ) ;
}
} ) ;
2020-10-16 04:22:13 +00:00
check_mustHitSection = new FlxUICheckBox ( 10 , 30 , null , null , " M u s t h i t s e c t i o n " , 100 ) ;
check_mustHitSection . name = ' c h e c k _ m u s t H i t ' ;
check_mustHitSection . checked = true ;
// _song.needsVoices = check_mustHit.checked;
2020-10-30 03:06:52 +00:00
2021-01-16 20:14:56 +00:00
check_altAnim = new FlxUICheckBox ( 10 , 400 , null , null , " A l t A n i m a t i o n " , 100 ) ;
check_altAnim . name = ' c h e c k _ a l t A n i m ' ;
2020-10-30 03:06:52 +00:00
check_changeBPM = new FlxUICheckBox ( 10 , 60 , null , null , ' C h a n g e B P M ' , 100 ) ;
check_changeBPM . name = ' c h e c k _ c h a n g e B P M ' ;
2020-10-16 04:22:13 +00:00
tab_group_section . add ( stepperLength ) ;
2020-10-30 03:06:52 +00:00
tab_group_section . add ( stepperSectionBPM ) ;
2020-10-18 01:47:59 +00:00
tab_group_section . add ( stepperCopy ) ;
2020-10-16 04:22:13 +00:00
tab_group_section . add ( check_mustHitSection ) ;
2021-01-16 20:14:56 +00:00
tab_group_section . add ( check_altAnim ) ;
2020-10-30 03:06:52 +00:00
tab_group_section . add ( check_changeBPM ) ;
2020-10-17 21:33:35 +00:00
tab_group_section . add ( copyButton ) ;
2020-12-25 08:40:01 +00:00
tab_group_section . add ( clearSectionButton ) ;
tab_group_section . add ( swapSection ) ;
2020-10-16 04:22:13 +00:00
UI_box . addGroup ( tab_group_section ) ;
2020-10-10 04:22:26 +00:00
}
2020-10-10 03:22:07 +00:00
2020-10-19 04:01:09 +00:00
var stepperSusLength: FlxUINumericStepper ;
2021-12-30 05:09:16 +00:00
var stepperPerNoteSpeed: FlxUINumericStepper ;
2020-10-19 04:01:09 +00:00
function addNoteUI ( ) : Void
{
var tab_group_note = new FlxUI ( null , UI_box ) ;
tab_group_note . name = ' N o t e ' ;
stepperSusLength = new FlxUINumericStepper ( 10 , 10 , Conductor . stepCrochet / 2 , 0 , 0 , Conductor . stepCrochet * 16 ) ;
stepperSusLength . value = 0 ;
stepperSusLength . name = ' n o t e _ s u s L e n g t h ' ;
2021-12-30 05:09:16 +00:00
stepperPerNoteSpeed = new FlxUINumericStepper ( 10 , 40 , 0.1 , 1 , 0.01 , 100 , 2 ) ;
stepperPerNoteSpeed . value = 1 ;
stepperPerNoteSpeed . name = " n o t e _ P e r N o t e S p e e d " ;
var noteSpeedName: FlxText = new FlxText ( 40 , stepperPerNoteSpeed . y , 0 , " N o t e S p e e d M u l t i p l i e r " ) ;
2020-10-19 04:01:09 +00:00
var applyLength: FlxButton = new FlxButton ( 100 , 10 , ' A p p l y ' ) ;
tab_group_note . add ( stepperSusLength ) ;
2021-12-30 05:09:16 +00:00
tab_group_note . add ( stepperPerNoteSpeed ) ;
tab_group_note . add ( noteSpeedName ) ;
2020-10-19 04:01:09 +00:00
tab_group_note . add ( applyLength ) ;
UI_box . addGroup ( tab_group_note ) ;
}
2021-09-20 17:21:25 +00:00
// var spec:SpectogramSprite;
2021-09-17 18:12:36 +00:00
2020-10-14 08:18:19 +00:00
function loadSong ( daSong : String ) : Void
{
if ( FlxG . sound . music != null )
2020-10-31 04:25:23 +00:00
{
2020-10-14 08:18:19 +00:00
FlxG . sound . music . stop ( ) ;
2020-10-31 04:25:23 +00:00
// vocals.stop();
}
2021-08-02 17:54:19 +00:00
var pathShit = Paths . inst ( daSong ) ;
if ( ! openfl . utils . Assets . cache . hasSound ( pathShit ) )
{
var library = Assets . getLibrary ( " s o n g s " ) ;
var symbolPath = pathShit . split ( " : " ) . pop ( ) ;
// @:privateAccess
// library.types.set(symbolPath, SOUND);
// @:privateAccess
// library.pathGroups.set(symbolPath, [library.__cacheBreak(symbolPath)]);
// var callback = callbacks.add("song:" + pathShit);
openfl . utils . Assets . loadSound ( pathShit ) . onComplete ( function ( _ )
{
// callback();
} ) ;
}
2021-02-10 20:18:14 +00:00
FlxG . sound . playMusic ( Paths . inst ( daSong ) , 0.6 ) ;
2020-10-31 04:25:23 +00:00
2022-02-11 19:21:42 +00:00
var musSpec: PolygonSpectogram = new PolygonSpectogram ( FlxG . sound . music , FlxColor . RED , FlxG . height / 2 , Math . floor ( FlxG . height / 2 ) ) ;
2022-02-18 21:29:29 +00:00
musSpec . x += 170 ;
2021-09-16 19:28:29 +00:00
musSpec . scrollFactor . set ( ) ;
2022-02-18 21:29:29 +00:00
musSpec . waveAmplitude = 50 ;
2021-12-30 05:09:16 +00:00
// musSpec.visType = FREQUENCIES;
2021-09-16 19:28:29 +00:00
add ( musSpec ) ;
2021-09-16 04:34:51 +00:00
2022-02-04 00:13:39 +00:00
sidePreview = new FlxSprite ( 0 , 0 ) . makeGraphic ( 40 , FlxG . height , FlxColor . GRAY ) ;
sidePreview . scrollFactor . set ( ) ;
add ( sidePreview ) ;
2021-09-16 04:34:51 +00:00
// trace(audioBuf.data.length);
2022-01-26 04:11:43 +00:00
playheadTest = new FlxSprite ( 0 , 0 ) . makeGraphic ( 30 , 2 , FlxColor . RED ) ;
2021-09-16 04:34:51 +00:00
playheadTest . scrollFactor . set ( ) ;
2022-02-04 00:13:39 +00:00
playheadTest . alpha = 0.5 ;
2021-09-16 04:34:51 +00:00
add ( playheadTest ) ;
2021-01-20 02:09:47 +00:00
// WONT WORK FOR TUTORIAL OR TEST SONG!!! REDO LATER
2021-09-20 17:21:25 +00:00
vocals = new VoicesGroup ( daSong , _song . voiceList ) ;
2021-09-20 15:32:35 +00:00
// vocals = new FlxSound().loadEmbedded(Paths.voices(daSong));
// FlxG.sound.list.add(vocals);
2020-10-14 08:18:19 +00:00
2022-02-12 02:39:43 +00:00
staticSpecGrp = new FlxTypedGroup < SpectogramSprite > ( ) ;
2021-09-20 17:21:25 +00:00
add ( staticSpecGrp ) ;
2021-10-08 01:01:46 +00:00
var aBoy: ABotVis = new ABotVis ( FlxG . sound . music ) ;
2021-12-30 05:09:16 +00:00
// add(aBoy);
2021-10-08 01:01:46 +00:00
2021-09-20 17:21:25 +00:00
for ( index => voc in vocals . members )
{
2022-02-12 02:39:43 +00:00
var vocalSpec: SpectogramSprite = new SpectogramSprite ( voc , FlxG . random . color ( 0xFFAAAAAA , FlxColor . WHITE , 100 ) , musSpec . daHeight ,
2022-02-09 19:00:04 +00:00
Math . floor ( FlxG . height / 2 ) ) ;
2021-09-20 17:21:25 +00:00
vocalSpec . x = 70 - ( 50 * index ) ;
2021-12-30 05:09:16 +00:00
// vocalSpec.visType = FREQUENCIES;
2021-09-20 17:21:25 +00:00
vocalSpec . daHeight = musSpec . daHeight ;
vocalSpec . y = vocalSpec . daHeight ;
vocalSpec . scrollFactor . set ( ) ;
add ( vocalSpec ) ;
2022-02-12 02:39:43 +00:00
var staticVocal: SpectogramSprite = new SpectogramSprite ( voc , FlxG . random . color ( 0xFFAAAAAA , FlxColor . WHITE , 100 ) , GRID_SIZE * 16 , GRID_SIZE * 8 ) ;
2021-09-20 17:21:25 +00:00
if ( index == 0 )
staticVocal . x -= 150 ;
2021-09-17 18:12:36 +00:00
2021-09-20 17:21:25 +00:00
if ( index == 1 )
staticVocal . x = gridBG . width ;
2022-02-11 19:21:42 +00:00
staticVocal . visType = STATIC ;
2021-09-20 17:21:25 +00:00
staticSpecGrp . add ( staticVocal ) ;
}
2021-09-16 19:28:29 +00:00
2020-10-14 08:18:19 +00:00
FlxG . sound . music . pause ( ) ;
2021-09-17 18:12:36 +00:00
2020-10-31 04:25:23 +00:00
vocals . pause ( ) ;
2020-10-14 08:18:19 +00:00
FlxG . sound . music . onComplete = function ( )
{
2020-10-31 04:25:23 +00:00
vocals . pause ( ) ;
vocals . time = 0 ;
2020-10-14 08:18:19 +00:00
FlxG . sound . music . pause ( ) ;
FlxG . sound . music . time = 0 ;
2021-02-11 22:13:50 +00:00
changeSection ( ) ;
2020-10-14 08:18:19 +00:00
} ;
}
2020-10-12 03:52:21 +00:00
function generateUI ( ) : Void
{
while ( bullshitUI . members . length > 0 )
{
bullshitUI . remove ( bullshitUI . members [ 0 ] , true ) ;
}
// general shit
var title: FlxText = new FlxText ( UI_box . x + 20 , UI_box . y + 20 , 0 ) ;
bullshitUI . add ( title ) ;
2020-10-13 05:18:50 +00:00
/ *
var loopCheck = new FlxUICheckBox ( UI_box . x + 10 , UI_box . y + 50 , null , null , " L o o p s " , 100 , [ ' l o o p c h e c k ' ] ) ;
2021-11-29 20:26:45 +00:00
loopCheck . checked = notes [ 0 ] elected . doesLoop ;
2020-10-13 05:18:50 +00:00
tooltips . add ( loopCheck , { title : ' S e c t i o n l o o p i n g ' , body : " W h e t h e r o r n o t i t ' s a s i m o n s a y s s t y l e s e c t i o n " , style : tooltipType } ) ;
bullshitUI . add ( loopCheck ) ;
2020-10-12 03:52:21 +00:00
2020-10-13 05:18:50 +00:00
* /
2020-10-12 03:52:21 +00:00
}
override function getEvent ( id : String , sender : Dynamic , data : Dynamic , ? params : Array < Dynamic > )
{
if ( id == FlxUICheckBox . CLICK_EVENT )
{
var check: FlxUICheckBox = cast sender ;
var label = check . getLabel ( ) . text ;
switch ( label )
{
2020-10-16 04:22:13 +00:00
c ase ' M u s t h i t s e c t i o n ' :
2021-12-06 22:49:05 +00:00
SongLoad . getSong ( ) [ curSection ] . mustHitSection = check . checked ;
2021-01-17 04:15:29 +00:00
updateHeads ( ) ;
2020-10-30 03:06:52 +00:00
c ase ' C h a n g e B P M ' :
2021-12-06 22:49:05 +00:00
SongLoad . getSong ( ) [ curSection ] . changeBPM = check . checked ;
2020-10-30 06:52:26 +00:00
FlxG . log . add ( ' c h a n g e d b p m s h i t ' ) ;
2021-01-16 20:14:56 +00:00
c ase " A l t A n i m a t i o n " :
2021-12-06 22:49:05 +00:00
SongLoad . getSong ( ) [ curSection ] . altAnim = check . checked ;
2020-10-16 04:22:13 +00:00
}
}
e lse if ( id == FlxUINumericStepper . CHANGE_EVENT && ( sender i s F l x U I N u m e r i c S t e p p e r ) )
{
var nums: FlxUINumericStepper = cast sender ;
var wname = nums . name ;
FlxG . log . add ( wname ) ;
if ( wname == ' s e c t i o n _ l e n g t h ' )
{
2021-12-06 22:49:05 +00:00
SongLoad . getSong ( ) [ curSection ] . lengthInSteps = Std . int ( nums . value ) ;
2020-10-16 11:03:10 +00:00
updateGrid ( ) ;
2020-10-12 03:52:21 +00:00
}
2020-10-18 01:47:59 +00:00
e lse if ( wname == ' s o n g _ s p e e d ' )
{
2021-12-06 22:49:05 +00:00
// _song.speed[SongLoad.curDiff] = nums.value;
_song . speed . normal = nums . value ;
2020-10-18 01:47:59 +00:00
}
e lse if ( wname == ' s o n g _ b p m ' )
{
2021-03-20 16:33:29 +00:00
tempBpm = nums . value ;
2021-02-11 22:13:50 +00:00
Conductor . mapBPMChanges ( _song ) ;
2022-03-30 01:56:04 +00:00
Conductor . bpm = nums . value ;
2020-10-18 01:47:59 +00:00
}
2020-10-19 04:01:09 +00:00
e lse if ( wname == ' n o t e _ s u s L e n g t h ' )
{
2022-01-21 22:23:12 +00:00
curSelectedNote . sustainLength = nums . value ;
2020-10-19 04:01:09 +00:00
updateGrid ( ) ;
}
2020-10-30 03:06:52 +00:00
e lse if ( wname == ' s e c t i o n _ b p m ' )
{
2021-12-06 22:49:05 +00:00
SongLoad . getSong ( ) [ curSection ] . bpm = nums . value ;
2020-10-30 03:06:52 +00:00
updateGrid ( ) ;
}
2020-10-12 03:52:21 +00:00
}
// FlxG.log.add(id + " WEED " + sender + " WEED " + data + " WEED " + params);
}
2020-10-16 11:03:10 +00:00
var updatedSection: Bool = false ;
2021-02-11 22:13:50 +00:00
/ * this function got o w n e d L O L
2021-03-02 04:00:02 +00:00
function lengthBpmBullshit ( ) : Float
{
2021-12-06 22:49:05 +00:00
if ( SongLoad . getSong ( ) [ curSection ] . changeBPM )
return SongLoad . getSong ( ) [ curSection ] . lengthInSteps * ( SongLoad . getSong ( ) [ curSection ] . bpm / _song . bpm ) ;
2021-03-02 04:00:02 +00:00
e lse
2021-12-06 22:49:05 +00:00
return SongLoad . getSong ( ) [ curSection ] . lengthInSteps ;
2021-02-11 22:13:50 +00:00
} * /
2022-02-04 00:13:39 +00:00
/ * *
* Gets the start time of section , defaults to the curSection
* @ param section
* @ return position of the song in . . . either seconds or milliseconds ... . woops
* /
function sectionStartTime ( ? funnySection : Int ) : Float
2021-02-11 22:13:50 +00:00
{
2022-02-04 00:13:39 +00:00
if ( funnySection == null )
funnySection = curSection ;
2021-03-20 16:33:29 +00:00
var daBPM: Float = _song . bpm ;
2021-02-11 22:13:50 +00:00
var daPos: Float = 0 ;
2022-02-04 00:13:39 +00:00
for ( i in 0 ... funnySection )
2021-02-11 22:13:50 +00:00
{
2021-12-06 22:49:05 +00:00
if ( SongLoad . getSong ( ) [ i ] . changeBPM )
2021-03-02 04:00:02 +00:00
{
2021-12-06 22:49:05 +00:00
daBPM = SongLoad . getSong ( ) [ i ] . bpm ;
2021-02-11 22:13:50 +00:00
}
2022-01-21 04:33:51 +00:00
daPos += 4 * sectionCalc ( daBPM ) ;
2021-02-11 22:13:50 +00:00
}
return daPos ;
2020-11-14 02:49:20 +00:00
}
2022-01-21 04:33:51 +00:00
function measureStartTime ( ) : Float
{
var daBPM: Float = _song . bpm ;
var daPos: Float = sectionStartTime ( ) ;
daPos = Math . floor ( FlxG . sound . music . time / sectionCalc ( daBPM ) ) * sectionCalc ( daBPM ) ;
return daPos ;
}
function sectionCalc ( bpm : Float )
{
return ( 1000 * 60 / bpm ) ;
}
2021-09-21 02:08:24 +00:00
var p1Muted: Bool = false ;
var p2Muted: Bool = false ;
2020-10-10 04:22:26 +00:00
override function update ( elapsed : Float )
{
2021-09-20 17:21:25 +00:00
// FlxG.camera.followLerp = CoolUtil.camLerpShit(0.05);
2021-09-17 18:12:36 +00:00
2022-01-26 04:11:43 +00:00
FlxG . sound . music . pan = FlxMath . remapToRange ( FlxG . mouse . screenX , 0 , FlxG . width , - 1 , 1 ) * 10 ;
2020-11-21 10:43:04 +00:00
curStep = recalculateSteps ( ) ;
2020-10-10 09:28:44 +00:00
Conductor . songPosition = FlxG . sound . music . time ;
2020-10-14 08:30:54 +00:00
_song . song = typingShit . text ;
2020-10-10 09:28:44 +00:00
2022-01-29 01:03:38 +00:00
playheadTest . y = CoolUtil . coolLerp ( playheadTest . y , FlxMath . remapToRange ( Conductor . songPosition , 0 , FlxG . sound . music . length , 0 , FlxG . height ) , 0.5 ) ;
2021-09-06 18:50:04 +00:00
2022-01-29 01:03:38 +00:00
var strumLinePos: Float = getYfromStrum ( ( Conductor . songPosition - sectionStartTime ( ) ) % ( Conductor . stepCrochet * SongLoad . getSong ( ) [ curSection ] . lengthInSteps ) ) ;
if ( FlxG . sound . music != null )
{
if ( FlxG . sound . music . playing )
strumLine . y = strumLinePos ;
e lse
strumLine . y = CoolUtil . coolLerp ( strumLine . y , strumLinePos , 0.5 ) ;
}
2020-10-13 08:07:04 +00:00
2021-09-16 04:34:51 +00:00
/ * if ( FlxG . sound . music . playing )
{
var normalizedShitIDK: Int = Std . int ( FlxMath . remapToRange ( Conductor . songPosition , 0 , FlxG . sound . music . length , 0 , audioBuf . data . length ) ) ;
FlxG . watch . addQuick ( ' W E I R D A U D I O S H I T L O L ' , audioBuf . data [ normalizedShitIDK ] ) ;
// leftIcon.scale.x = FlxMath.remapToRange(audioBuf.data[normalizedShitIDK], 0, 255, 1, 2);
} * /
2021-09-06 18:50:04 +00:00
2021-04-10 22:23:56 +00:00
if ( FlxG . keys . justPressed . X )
toggleAltAnimNote ( ) ;
2021-02-11 22:13:50 +00:00
if ( curBeat % 4 == 0 && curStep >= 16 * ( curSection + 1 ) )
2020-10-13 08:07:04 +00:00
{
2022-03-07 23:36:29 +00:00
// trace(curStep);
// trace((SongLoad.getSong()[curSection].lengthInSteps) * (curSection + 1));
2021-02-11 22:13:50 +00:00
trace ( ' D U M B S H I T ' ) ;
2020-10-13 05:18:50 +00:00
2021-12-06 22:49:05 +00:00
if ( SongLoad . getSong ( ) [ curSection + 1 ] == null )
2021-02-11 22:13:50 +00:00
{
addSection ( ) ;
2020-10-13 08:07:04 +00:00
}
2021-02-11 22:13:50 +00:00
changeSection ( curSection + 1 , false ) ;
2020-10-13 08:07:04 +00:00
}
2020-11-18 00:22:29 +00:00
FlxG . watch . addQuick ( ' d a B e a t ' , curBeat ) ;
FlxG . watch . addQuick ( ' d a S t e p ' , curStep ) ;
2022-01-26 04:11:43 +00:00
if ( FlxG . mouse . pressedMiddle && FlxG . mouse . overlaps ( gridBG ) )
2021-09-21 19:39:30 +00:00
{
if ( FlxG . sound . music . playing )
{
FlxG . sound . music . pause ( ) ;
vocals . pause ( ) ;
}
2022-01-29 01:03:38 +00:00
FlxG . sound . music . time = CoolUtil . coolLerp ( FlxG . sound . music . time , getStrumTime ( FlxG . mouse . y ) + sectionStartTime ( ) , 0.5 ) ;
2021-09-21 19:39:30 +00:00
vocals . time = FlxG . sound . music . time ;
}
2021-09-21 02:08:24 +00:00
if ( FlxG . mouse . pressed )
2020-10-19 02:34:21 +00:00
{
2022-01-26 04:11:43 +00:00
if ( FlxG . keys . pressed . ALT && FlxG . mouse . overlaps ( gridBG ) ) // same shit as middle click / hold on grid
2021-09-21 02:08:24 +00:00
{
if ( FlxG . sound . music . playing )
{
FlxG . sound . music . pause ( ) ;
vocals . pause ( ) ;
}
FlxG . sound . music . time = getStrumTime ( FlxG . mouse . y ) + sectionStartTime ( ) ;
vocals . time = FlxG . sound . music . time ;
}
e lse
2020-10-19 02:34:21 +00:00
{
2022-01-26 04:11:43 +00:00
if ( FlxG . mouse . screenX <= 30 && FlxMath . inBounds ( FlxG . mouse . screenY , 0 , FlxG . height ) )
{
if ( FlxG . sound . music . playing )
{
FlxG . sound . music . pause ( ) ;
vocals . pause ( ) ;
}
2022-01-29 01:03:38 +00:00
FlxG . sound . music . time = CoolUtil . coolLerp ( FlxG . sound . music . time ,
FlxMath . remapToRange ( FlxG . mouse . screenY , 0 , FlxG . height , 0 , FlxG . sound . music . length ) , 0.5 ) ;
2022-01-26 04:11:43 +00:00
vocals . time = FlxG . sound . music . time ;
}
2021-09-21 02:08:24 +00:00
if ( FlxG . mouse . justPressed )
2020-10-19 02:34:21 +00:00
{
2021-09-21 02:08:24 +00:00
if ( FlxG . mouse . overlaps ( leftIcon ) )
2020-10-19 02:34:21 +00:00
{
2022-03-26 02:30:37 +00:00
if ( leftIcon . characterId == _song . player1 )
2020-10-19 04:01:09 +00:00
{
2021-09-21 02:08:24 +00:00
p1Muted = ! p1Muted ;
leftIcon . animation . curAnim . curFrame = p1Muted ? 1 : 0 ;
2020-10-19 04:01:09 +00:00
}
e lse
{
2021-09-21 02:08:24 +00:00
p2Muted = ! p2Muted ;
leftIcon . animation . curAnim . curFrame = p2Muted ? 1 : 0 ;
}
vocals . members [ 0 ] . volume = p1Muted ? 0 : 1 ;
// null check jus in case using old shit?
if ( vocals . members [ 1 ] != null )
vocals . members [ 1 ] . volume = p2Muted ? 0 : 1 ;
}
// sloppy copypaste lol deal with it!
if ( FlxG . mouse . overlaps ( rightIcon ) )
{
2022-03-26 02:30:37 +00:00
if ( rightIcon . characterId == _song . player1 )
2021-09-21 02:08:24 +00:00
{
p1Muted = ! p1Muted ;
rightIcon . animation . curAnim . curFrame = p1Muted ? 1 : 0 ;
}
e lse
{
rightIcon . animation . curAnim . curFrame = p2Muted ? 1 : 0 ;
p2Muted = ! p2Muted ;
}
vocals . members [ 0 ] . volume = p1Muted ? 0 : 1 ;
// null check jus in case using old shit?
if ( vocals . members [ 1 ] != null )
vocals . members [ 1 ] . volume = p2Muted ? 0 : 1 ;
}
if ( FlxG . mouse . overlaps ( curRenderedNotes ) )
{
curRenderedNotes . forEach ( function ( note : Note )
{
if ( FlxG . mouse . overlaps ( note ) )
{
2022-01-21 22:23:12 +00:00
selectNote ( note ) ;
2021-09-21 02:08:24 +00:00
}
} ) ;
}
e lse
{
2022-01-21 22:23:12 +00:00
if ( FlxG . mouse . overlaps ( gridBG ) )
2021-09-21 02:08:24 +00:00
{
FlxG . log . add ( ' a d d e d n o t e ' ) ;
addNote ( ) ;
2020-10-19 04:01:09 +00:00
}
2020-10-19 02:34:21 +00:00
}
2020-10-20 01:59:00 +00:00
}
}
2020-10-19 02:34:21 +00:00
}
2022-01-21 22:23:12 +00:00
if ( FlxG . mouse . pressedRight )
{
if ( FlxG . mouse . overlaps ( curRenderedNotes ) )
{
curRenderedNotes . forEach ( function ( note : Note )
{
if ( FlxG . mouse . overlaps ( note ) )
{
trace ( ' t r y i n t o d e l e t e n o t e . . . ' ) ;
deleteNote ( note ) ;
}
} ) ;
}
}
2022-02-06 18:56:18 +00:00
if ( FlxG . mouse . justReleased )
justPlacedNote = false ;
2022-01-21 04:36:57 +00:00
if ( FlxG . mouse . overlaps ( gridBG ) )
2020-10-13 05:18:50 +00:00
{
2022-02-06 18:56:18 +00:00
if ( justPlacedNote && FlxG . mouse . pressed && FlxG . mouse . y > getYfromStrum ( curSelectedNote . strumTime ) )
{
var minusStuff: Float = FlxG . mouse . y - getYfromStrum ( curSelectedNote . strumTime ) ;
minusStuff -= GRID_SIZE ;
2022-02-10 19:23:45 +00:00
minusStuff += GRID_SIZE / 2 ;
2022-02-06 18:56:18 +00:00
minusStuff = Math . floor ( minusStuff / GRID_SIZE ) * GRID_SIZE ;
minusStuff = FlxMath . remapToRange ( minusStuff , 0 , 40 , 0 , Conductor . stepCrochet ) ;
curSelectedNote . sustainLength = minusStuff ;
updateNoteUI ( ) ;
updateGrid ( ) ;
}
2020-10-13 08:07:04 +00:00
dummyArrow . x = Math . floor ( FlxG . mouse . x / GRID_SIZE ) * GRID_SIZE ;
if ( FlxG . keys . pressed . SHIFT )
dummyArrow . y = FlxG . mouse . y ;
e lse
dummyArrow . y = Math . floor ( FlxG . mouse . y / GRID_SIZE ) * GRID_SIZE ;
2020-10-13 05:18:50 +00:00
}
2020-10-13 08:37:19 +00:00
if ( FlxG . keys . justPressed . ENTER )
{
2021-09-22 19:33:30 +00:00
autosaveSong ( ) ;
2021-01-14 03:38:31 +00:00
lastSection = curSection ;
2022-03-11 06:30:01 +00:00
PlayState . currentSong = _song ;
2021-09-08 15:53:20 +00:00
// JUST FOR DEBUG DARNELL STUFF, GENERALIZE THIS FOR BETTER LOADING ELSEWHERE TOO!
PlayState . storyWeek = 8 ;
2020-10-14 01:23:22 +00:00
FlxG . sound . music . stop ( ) ;
2020-10-31 04:25:23 +00:00
vocals . stop ( ) ;
2021-08-02 17:54:19 +00:00
LoadingState . loadAndSwitchState ( new PlayState ( ) ) ;
// FlxG.switchState(new PlayState());
2020-10-13 08:37:19 +00:00
}
2021-01-14 03:38:31 +00:00
if ( FlxG . keys . justPressed . E )
{
changeNoteSustain ( Conductor . stepCrochet ) ;
}
if ( FlxG . keys . justPressed . Q )
{
changeNoteSustain ( - Conductor . stepCrochet ) ;
}
2021-01-08 01:38:32 +00:00
if ( FlxG . keys . justPressed . TAB )
{
if ( FlxG . keys . pressed . SHIFT )
{
UI_box . selected_tab -= 1 ;
if ( UI_box . selected_tab < 0 )
UI_box . selected_tab = 2 ;
}
e lse
{
UI_box . selected_tab += 1 ;
if ( UI_box . selected_tab >= 3 )
UI_box . selected_tab = 0 ;
}
}
2020-10-14 08:18:19 +00:00
if ( ! typingShit . hasFocus )
2020-10-10 04:22:26 +00:00
{
2020-10-14 08:18:19 +00:00
if ( FlxG . keys . justPressed . SPACE )
2020-10-10 09:28:44 +00:00
{
2020-10-14 08:18:19 +00:00
if ( FlxG . sound . music . playing )
{
FlxG . sound . music . pause ( ) ;
2020-10-31 04:25:23 +00:00
vocals . pause ( ) ;
2020-10-14 08:18:19 +00:00
}
e lse
2020-10-31 04:25:23 +00:00
{
vocals . play ( ) ;
2020-10-14 08:18:19 +00:00
FlxG . sound . music . play ( ) ;
2020-10-31 04:25:23 +00:00
}
2020-10-10 09:28:44 +00:00
}
2020-10-14 08:18:19 +00:00
if ( FlxG . keys . justPressed . R )
{
2022-01-21 04:33:51 +00:00
if ( FlxG . keys . pressed . CONTROL )
resetSection ( BEGINNING ) ;
e lse if ( FlxG . keys . pressed . SHIFT )
resetSection ( MEASURE ) ;
2021-01-08 01:38:32 +00:00
e lse
2022-01-21 04:33:51 +00:00
resetSection ( SECTION ) ;
2021-01-07 04:02:23 +00:00
}
if ( FlxG . mouse . wheel != 0 )
{
FlxG . sound . music . pause ( ) ;
vocals . pause ( ) ;
2021-09-20 17:21:25 +00:00
var ctrlMod: Float = FlxG . keys . pressed . CONTROL ? 0.1 : 1 ;
var shiftMod: Float = FlxG . keys . pressed . SHIFT ? 2 : 1 ;
FlxG . sound . music . time -= ( FlxG . mouse . wheel * Conductor . stepCrochet * 0.4 * ctrlMod * shiftMod ) ;
2021-01-07 04:02:23 +00:00
vocals . time = FlxG . sound . music . time ;
2020-10-14 08:18:19 +00:00
}
2020-10-14 04:05:55 +00:00
2021-12-30 05:09:16 +00:00
if ( FlxG . keys . justReleased . S )
{
FlxG . sound . music . pause ( ) ;
vocals . pause ( ) ;
#if HAS_PITCH
FlxG . sound . music . pitch = 1 ;
vocals . pitch = 1 ;
#end
}
2020-12-25 23:24:20 +00:00
if ( ! FlxG . keys . pressed . SHIFT )
2020-10-14 08:18:19 +00:00
{
2020-12-25 23:24:20 +00:00
if ( FlxG . keys . pressed . W || FlxG . keys . pressed . S )
{
2022-03-13 18:36:03 +00:00
var daTime: Float = 700 * elapsed ;
2020-10-14 04:05:55 +00:00
2021-09-16 19:28:29 +00:00
if ( FlxG . keys . pressed . CONTROL )
daTime *= 0.2 ;
2020-12-25 23:24:20 +00:00
if ( FlxG . keys . pressed . W )
{
2021-12-30 05:09:16 +00:00
FlxG . sound . music . pause ( ) ;
vocals . pause ( ) ;
2020-12-25 23:24:20 +00:00
FlxG . sound . music . time -= daTime ;
2021-12-30 05:09:16 +00:00
vocals . time = FlxG . sound . music . time ;
2020-12-25 23:24:20 +00:00
}
e lse
2021-12-30 05:09:16 +00:00
{
if ( FlxG . keys . justPressed . S )
{
FlxG . sound . music . play ( ) ;
vocals . play ( ) ;
2020-12-25 23:24:20 +00:00
2021-12-30 05:09:16 +00:00
#if HAS_PITCH
FlxG . sound . music . pitch = 0.5 ;
vocals . pitch = 0.5 ;
#end
}
}
// FlxG.sound.music.time += daTime;
// vocals.time = FlxG.sound.music.time;
2020-10-14 08:18:19 +00:00
}
2020-12-25 23:24:20 +00:00
}
e lse
{
if ( FlxG . keys . justPressed . W || FlxG . keys . justPressed . S )
{
var daTime: Float = Conductor . stepCrochet * 2 ;
2020-10-31 04:25:23 +00:00
2020-12-25 23:24:20 +00:00
if ( FlxG . keys . justPressed . W )
{
2021-12-30 05:09:16 +00:00
FlxG . sound . music . pause ( ) ;
vocals . pause ( ) ;
2020-12-25 23:24:20 +00:00
FlxG . sound . music . time -= daTime ;
2021-12-30 05:09:16 +00:00
vocals . time = FlxG . sound . music . time ;
2020-12-25 23:24:20 +00:00
}
e lse
2021-12-30 05:09:16 +00:00
{
if ( FlxG . keys . justPressed . S )
{
// FlxG.sound.music.time += daTime;
2022-02-16 21:31:20 +00:00
FlxG . sound . music . pause ( ) ;
vocals . pause ( ) ;
FlxG . sound . music . time += daTime ;
vocals . time = FlxG . sound . music . time ;
// FlxG.sound.music.play();
// vocals.play();
2020-12-25 23:24:20 +00:00
2021-12-30 05:09:16 +00:00
#if HAS_PITCH
FlxG . sound . music . pitch = 0.2 ;
vocals . pitch = 0.2 ;
#end
}
}
2020-12-25 23:24:20 +00:00
}
2020-10-14 04:05:55 +00:00
}
2020-10-13 08:07:04 +00:00
}
2020-10-30 03:06:52 +00:00
_song . bpm = tempBpm ;
2020-10-14 08:30:54 +00:00
2020-10-30 03:06:52 +00:00
/ * if ( FlxG . keys . justPressed . UP )
2022-04-18 23:36:09 +00:00
Conductor . bpm = Conductor . bpm + 1 ;
2020-10-30 03:06:52 +00:00
if ( FlxG . keys . justPressed . DOWN )
2022-04-18 23:36:09 +00:00
Conductor . bpm = Conductor . bpm - 1 ; * /
2020-10-10 09:28:44 +00:00
2020-12-09 18:53:46 +00:00
var shiftThing: Int = 1 ;
if ( FlxG . keys . pressed . SHIFT )
shiftThing = 4 ;
2021-01-07 04:02:23 +00:00
if ( FlxG . keys . justPressed . RIGHT || FlxG . keys . justPressed . D )
2020-12-09 18:53:46 +00:00
changeSection ( curSection + shiftThing ) ;
2021-01-07 04:02:23 +00:00
if ( FlxG . keys . justPressed . LEFT || FlxG . keys . justPressed . A )
2020-12-09 18:53:46 +00:00
changeSection ( curSection - shiftThing ) ;
2020-10-13 08:07:04 +00:00
2021-09-20 17:21:25 +00:00
bpmTxt . text = bpmTxt . text = Std . string ( FlxMath . roundDecimal ( Conductor . songPosition / 1000 , 3 ) )
2020-12-09 18:53:46 +00:00
+ " / "
2021-09-20 17:21:25 +00:00
+ Std . string ( FlxMath . roundDecimal ( FlxG . sound . music . length / 1000 , 3 ) )
2020-12-09 18:53:46 +00:00
+ " \n S e c t i o n : "
+ curSection ;
2020-10-10 04:22:26 +00:00
super . update ( elapsed ) ;
}
2021-01-14 03:38:31 +00:00
function changeNoteSustain ( value : Float ) : Void
{
2021-01-20 12:19:48 +00:00
if ( curSelectedNote != null )
2021-01-14 03:38:31 +00:00
{
2022-01-21 22:23:12 +00:00
curSelectedNote . sustainLength += value ;
curSelectedNote . sustainLength = Math . max ( curSelectedNote . sustainLength , 0 ) ;
2021-01-14 03:38:31 +00:00
}
updateNoteUI ( ) ;
updateGrid ( ) ;
}
2021-04-10 22:23:56 +00:00
function toggleAltAnimNote ( ) : Void
{
if ( curSelectedNote != null )
{
2022-01-21 22:23:12 +00:00
trace ( ' A L T N O T E S H I T ' ) ;
2022-03-23 05:18:23 +00:00
curSelectedNote . altNote = ( curSelectedNote . altNote == " a l t " ) ? " " : " a l t " ;
2022-01-21 22:23:12 +00:00
trace ( curSelectedNote . altNote ) ;
2021-04-10 22:23:56 +00:00
}
}
2020-11-21 10:43:04 +00:00
function recalculateSteps ( ) : Int
{
2021-02-11 22:13:50 +00:00
var lastChange: BPMChangeEvent = {
stepTime : 0 ,
songTime : 0 ,
bpm : 0
}
for ( i in 0 ... Conductor . bpmChangeMap . length )
2020-11-21 10:43:04 +00:00
{
2021-02-11 22:13:50 +00:00
if ( FlxG . sound . music . time > Conductor . bpmChangeMap [ i ] . songTime )
lastChange = Conductor . bpmChangeMap [ i ] ;
2020-11-21 10:43:04 +00:00
}
2021-02-11 22:13:50 +00:00
curStep = lastChange . stepTime + Math . floor ( ( FlxG . sound . music . time - lastChange . songTime ) / Conductor . stepCrochet ) ;
2020-11-21 10:43:04 +00:00
updateBeat ( ) ;
return curStep ;
}
2022-01-21 04:33:51 +00:00
function resetSection ( songBeginning : SongResetType = SECTION ) : Void
2021-01-07 04:02:23 +00:00
{
updateGrid ( ) ;
FlxG . sound . music . pause ( ) ;
vocals . pause ( ) ;
2022-01-21 04:33:51 +00:00
switch ( songBeginning )
2021-01-08 01:38:32 +00:00
{
2022-01-21 04:33:51 +00:00
c ase SECTION :
// Basically old shit from changeSection???
FlxG . sound . music . time = sectionStartTime ( ) ;
c ase BEGINNING :
FlxG . sound . music . time = 0 ;
curSection = 0 ;
c ase MEASURE :
FlxG . sound . music . time = measureStartTime ( ) ; // Math.floor(FlxG.mouse.y / GRID_SIZE) * GRID_SIZE
d efault :
2021-01-08 01:38:32 +00:00
}
2021-01-07 04:02:23 +00:00
vocals . time = FlxG . sound . music . time ;
updateCurStep ( ) ;
updateGrid ( ) ;
updateSectionUI ( ) ;
}
2020-10-13 08:07:04 +00:00
function changeSection ( sec : Int = 0 , ? updateMusic : Bool = true ) : Void
{
2022-03-07 23:36:29 +00:00
// trace('changing section' + sec);
2020-10-16 11:03:10 +00:00
2021-12-06 22:49:05 +00:00
if ( SongLoad . getSong ( ) [ sec ] != null )
2020-10-13 08:07:04 +00:00
{
curSection = sec ;
2020-10-30 06:52:26 +00:00
updateGrid ( ) ;
2020-10-13 08:07:04 +00:00
if ( updateMusic )
{
FlxG . sound . music . pause ( ) ;
2020-10-31 04:25:23 +00:00
vocals . pause ( ) ;
2020-10-13 08:07:04 +00:00
2021-02-11 22:13:50 +00:00
/ * var daNum: Int = 0 ;
2021-03-02 04:00:02 +00:00
var daLength: Float = 0 ;
while ( daNum <= sec )
{
daLength += lengthBpmBullshit ( ) ;
daNum ++ ;
2021-02-11 22:13:50 +00:00
} * /
2020-10-13 08:07:04 +00:00
2021-02-11 22:13:50 +00:00
FlxG . sound . music . time = sectionStartTime ( ) ;
2020-10-31 04:25:23 +00:00
vocals . time = FlxG . sound . music . time ;
2020-10-16 11:03:10 +00:00
updateCurStep ( ) ;
2020-10-13 08:07:04 +00:00
}
2020-10-16 04:22:13 +00:00
2020-10-30 03:06:52 +00:00
updateGrid ( ) ;
2020-10-16 04:22:13 +00:00
updateSectionUI ( ) ;
2020-10-13 08:07:04 +00:00
}
}
2020-10-18 01:47:59 +00:00
function copySection ( ? sectionNum : Int = 1 )
2020-10-17 21:33:35 +00:00
{
2020-10-18 01:47:59 +00:00
var daSec = FlxMath . maxInt ( curSection , sectionNum ) ;
2020-10-17 21:33:35 +00:00
2022-01-22 21:53:38 +00:00
for ( noteShit in SongLoad . getSong ( ) [ daSec - sectionNum ] . sectionNotes )
2020-10-17 21:33:35 +00:00
{
2022-01-22 21:53:38 +00:00
var strum = noteShit . strumTime + Conductor . stepCrochet * ( SongLoad . getSong ( ) [ daSec ] . lengthInSteps * sectionNum ) ;
2020-10-19 02:18:06 +00:00
2022-01-22 21:53:38 +00:00
var copiedNote: Note = new Note ( strum , noteShit . noteData ) ;
copiedNote . data . sustainLength = noteShit . sustainLength ;
SongLoad . getSong ( ) [ daSec ] . sectionNotes . push ( copiedNote . data ) ;
2020-10-17 21:33:35 +00:00
}
updateGrid ( ) ;
}
2020-10-16 04:22:13 +00:00
function updateSectionUI ( ) : Void
{
2021-12-06 22:49:05 +00:00
var sec = SongLoad . getSong ( ) [ curSection ] ;
2020-10-16 04:22:13 +00:00
stepperLength . value = sec . lengthInSteps ;
check_mustHitSection . checked = sec . mustHitSection ;
2021-01-16 20:14:56 +00:00
check_altAnim . checked = sec . altAnim ;
2020-10-30 03:06:52 +00:00
check_changeBPM . checked = sec . changeBPM ;
stepperSectionBPM . value = sec . bpm ;
2021-01-17 04:15:29 +00:00
updateHeads ( ) ;
}
function updateHeads ( ) : Void
{
if ( check_mustHitSection . checked )
{
2022-03-26 02:30:37 +00:00
leftIcon . characterId = ( _song . player1 ) ;
rightIcon . characterId = ( _song . player2 ) ;
2021-09-21 02:08:24 +00:00
leftIcon . animation . curAnim . curFrame = p1Muted ? 1 : 0 ;
rightIcon . animation . curAnim . curFrame = p2Muted ? 1 : 0 ;
2021-01-17 04:15:29 +00:00
}
e lse
{
2022-03-26 02:30:37 +00:00
leftIcon . characterId = ( _song . player2 ) ;
rightIcon . characterId = ( _song . player1 ) ;
2021-09-21 02:08:24 +00:00
leftIcon . animation . curAnim . curFrame = p2Muted ? 1 : 0 ;
rightIcon . animation . curAnim . curFrame = p1Muted ? 1 : 0 ;
2021-01-17 04:15:29 +00:00
}
2021-07-16 02:30:19 +00:00
leftIcon . setGraphicSize ( 0 , 45 ) ;
rightIcon . setGraphicSize ( 0 , 45 ) ;
2021-12-30 05:09:16 +00:00
leftIcon . height *= 0.6 ;
rightIcon . height *= 0.6 ;
2020-10-16 04:22:13 +00:00
}
2020-10-19 04:01:09 +00:00
function updateNoteUI ( ) : Void
{
2021-01-20 12:19:48 +00:00
if ( curSelectedNote != null )
2022-01-21 22:23:12 +00:00
stepperSusLength . value = curSelectedNote . sustainLength ;
2020-10-19 04:01:09 +00:00
}
2020-10-13 08:07:04 +00:00
function updateGrid ( ) : Void
{
2021-09-20 17:21:25 +00:00
// null if checks jus cuz i put updateGrid() in some weird places!
if ( staticSpecGrp != null )
{
staticSpecGrp . forEach ( function ( spec )
{
if ( spec != null )
spec . generateSection ( sectionStartTime ( ) , ( Conductor . stepCrochet * 32 ) / 1000 ) ;
} ) ;
}
2021-09-17 18:12:36 +00:00
2020-10-13 08:07:04 +00:00
while ( curRenderedNotes . members . length > 0 )
{
curRenderedNotes . remove ( curRenderedNotes . members [ 0 ] , true ) ;
}
2020-10-19 02:34:21 +00:00
while ( curRenderedSustains . members . length > 0 )
{
curRenderedSustains . remove ( curRenderedSustains . members [ 0 ] , true ) ;
}
2022-02-04 00:13:39 +00:00
// generates the cool sidebar shit
2022-02-09 18:37:57 +00:00
if ( sidePreview != null && sidePreview . active )
2022-02-04 00:13:39 +00:00
{
sidePreview . drawRect ( 0 , 0 , 40 , FlxG . height , 0xFF444444 ) ;
/ *
var sectionsNeeded: Int = Std . int ( FlxG . sound . music . length / ( sectionCalc ( _song . bpm ) * 4 ) ) ;
while ( sectionsNeeded > 0 )
{
sidePreview . drawRect ( 0 , sectionsNeeded * ( FlxG . height / sectionsNeeded ) , 40 , FlxG . height / sectionsNeeded ,
( sectionsNeeded % 2 == 0 ? 0xFF000000 : 0xFFFFFFFF ) ) ;
sectionsNeeded -- ;
}
* /
for ( secIndex => sideSection in SongLoad . getSong ( ) )
{
for ( notes in sideSection . sectionNotes )
{
2022-02-10 19:23:45 +00:00
var col: Int = Note . codeColors [ notes . noteData % 4 ] ;
2022-02-04 00:13:39 +00:00
2022-02-04 00:51:16 +00:00
var noteFlip: Int = ( sideSection . mustHitSection ? 1 : - 1 ) ;
var noteX: Float = 5 * ( ( ( notes . noteData - 4 ) * noteFlip ) + 4 ) ;
sidePreview . drawRect ( noteX , FlxMath . remapToRange ( notes . strumTime , 0 , FlxG . sound . music . length , 0 , FlxG . height ) , 5 , 1 , col ) ;
2022-02-04 00:13:39 +00:00
}
}
}
2022-01-22 21:53:38 +00:00
var sectionInfo: Array < NoteData > = SongLoad . getSong ( ) [ curSection ] . sectionNotes ;
2020-10-13 08:07:04 +00:00
2021-12-06 22:49:05 +00:00
if ( SongLoad . getSong ( ) [ curSection ] . changeBPM && SongLoad . getSong ( ) [ curSection ] . bpm > 0 )
2020-10-30 03:06:52 +00:00
{
2022-03-30 01:56:04 +00:00
Conductor . bpm = SongLoad . getSong ( ) [ curSection ] . bpm ;
2021-02-11 22:13:50 +00:00
FlxG . log . add ( ' C H A N G E D B P M ! ' ) ;
2020-10-30 03:06:52 +00:00
}
e lse
{
2021-03-02 04:00:02 +00:00
// get last bpm
2021-03-20 16:33:29 +00:00
var daBPM: Float = _song . bpm ;
2021-02-11 22:13:50 +00:00
for ( i in 0 ... curSection )
2021-12-06 22:49:05 +00:00
if ( SongLoad . getSong ( ) [ i ] . changeBPM )
daBPM = SongLoad . getSong ( ) [ i ] . bpm ;
2022-03-30 01:56:04 +00:00
Conductor . bpm = daBPM ;
2020-10-30 03:06:52 +00:00
}
2020-10-19 02:34:21 +00:00
/ * // PORT BULLSHIT, INCASE THERE'S NO SUSTAIN DATA FOR A NOTE
2021-12-06 22:49:05 +00:00
for ( sec in 0 ... SongLoad . getSong ( ) . length )
2020-10-19 02:34:21 +00:00
{
2021-12-06 22:49:05 +00:00
for ( notesse in 0 ... SongLoad . getSong ( ) [ sec ] . sectionNotes . length )
2020-10-19 02:34:21 +00:00
{
2021-12-06 22:49:05 +00:00
if ( SongLoad . getSong ( ) [ sec ] . sectionNotes [ notesse ] [ 2 ] == null )
2020-10-19 02:34:21 +00:00
{
trace ( ' S U S N U L L ' ) ;
2021-12-06 22:49:05 +00:00
SongLoad . getSong ( ) [ sec ] . sectionNotes [ notesse ] [ 2 ] = 0 ;
2020-10-19 02:34:21 +00:00
}
}
}
* /
2020-10-13 08:07:04 +00:00
for ( i in sectionInfo )
{
2022-01-21 22:23:12 +00:00
var daNoteInfo = i . noteData ;
var daStrumTime = i . strumTime ;
var daSus = i . sustainLength ;
2020-10-13 08:07:04 +00:00
2020-10-19 02:18:06 +00:00
var note: Note = new Note ( daStrumTime , daNoteInfo % 4 ) ;
2022-01-22 21:53:38 +00:00
note . data . sustainLength = daSus ;
2020-10-13 08:07:04 +00:00
note . setGraphicSize ( GRID_SIZE , GRID_SIZE ) ;
note . updateHitbox ( ) ;
2020-10-19 02:18:06 +00:00
note . x = Math . floor ( daNoteInfo * GRID_SIZE ) ;
2021-12-06 22:49:05 +00:00
note . y = Math . floor ( getYfromStrum ( ( daStrumTime - sectionStartTime ( ) ) % ( Conductor . stepCrochet * SongLoad . getSong ( ) [ curSection ] . lengthInSteps ) ) ) ;
2020-10-13 08:07:04 +00:00
curRenderedNotes . add ( note ) ;
2020-10-19 02:51:01 +00:00
if ( daSus > 0 )
{
2020-10-21 20:12:32 +00:00
var sustainVis: FlxSprite = new FlxSprite ( note . x + ( GRID_SIZE / 2 ) ,
2020-10-30 03:06:52 +00:00
note . y + GRID_SIZE ) . makeGraphic ( 8 , Math . floor ( FlxMath . remapToRange ( daSus , 0 , Conductor . stepCrochet * 16 , 0 , gridBG . height ) ) ) ;
2022-02-10 19:23:45 +00:00
sustainVis . x -= sustainVis . width / 2 ;
sustainVis . color = Note . codeColors [ note . data . noteData % 4 ] ;
2020-10-19 02:51:01 +00:00
curRenderedSustains . add ( sustainVis ) ;
}
2020-10-13 08:07:04 +00:00
}
}
private function addSection ( lengthInSteps : Int = 16 ) : Void
{
2020-10-30 03:06:52 +00:00
var sec: SwagSection = {
lengthInSteps : lengthInSteps ,
bpm : _song . bpm ,
changeBPM : false ,
mustHitSection : true ,
sectionNotes : [ ] ,
2021-01-16 20:14:56 +00:00
typeOfSection : 0 ,
altAnim : false
2020-10-30 03:06:52 +00:00
} ;
2021-12-06 22:49:05 +00:00
SongLoad . getSong ( ) . push ( sec ) ;
2020-10-13 08:07:04 +00:00
}
2020-10-19 04:01:09 +00:00
function selectNote ( note : Note ) : Void
{
var swagNum: Int = 0 ;
2021-12-06 22:49:05 +00:00
for ( i in SongLoad . getSong ( ) [ curSection ] . sectionNotes )
2020-10-19 04:01:09 +00:00
{
2022-01-22 21:53:38 +00:00
if ( i . strumTime == note . data . strumTime && i . noteData % 4 == note . data . noteData )
2020-10-19 04:01:09 +00:00
{
2021-12-06 22:49:05 +00:00
curSelectedNote = SongLoad . getSong ( ) [ curSection ] . sectionNotes [ swagNum ] ;
2020-10-19 04:01:09 +00:00
}
swagNum += 1 ;
}
updateGrid ( ) ;
updateNoteUI ( ) ;
}
2020-10-14 01:23:22 +00:00
function deleteNote ( note : Note ) : Void
{
2021-12-06 22:49:05 +00:00
for ( i in SongLoad . getSong ( ) [ curSection ] . sectionNotes )
2020-10-14 01:23:22 +00:00
{
2022-01-22 21:57:49 +00:00
if ( i . strumTime == note . data . strumTime && i . noteData % 4 == note . data . noteData )
2020-10-14 01:23:22 +00:00
{
2021-09-16 04:56:49 +00:00
var placeIDK: Int = Std . int ( ( ( Math . floor ( dummyArrow . y / GRID_SIZE ) * GRID_SIZE ) ) / 40 ) ;
placeIDK = Std . int ( Math . min ( placeIDK , 15 ) ) ;
placeIDK = Std . int ( Math . max ( placeIDK , 1 ) ) ;
trace ( placeIDK ) ;
FlxG . sound . play ( Paths . sound ( ' f u n n y N o i s e / f u n n y N o i s e - 0 ' + placeIDK ) ) ;
2020-10-14 01:23:22 +00:00
FlxG . log . add ( ' F O U N D E V I L N U M B E R ' ) ;
2021-12-06 22:49:05 +00:00
SongLoad . getSong ( ) [ curSection ] . sectionNotes . remove ( i ) ;
2020-10-14 01:23:22 +00:00
}
}
2020-10-29 02:47:10 +00:00
updateGrid ( ) ;
}
2020-12-25 08:40:01 +00:00
function clearSection ( ) : Void
{
2021-12-06 22:49:05 +00:00
SongLoad . getSong ( ) [ curSection ] . sectionNotes = [ ] ;
2020-12-25 08:40:01 +00:00
updateGrid ( ) ;
}
2020-10-29 02:47:10 +00:00
function clearSong ( ) : Void
{
2021-12-06 22:49:05 +00:00
for ( daSection in 0 ... SongLoad . getSong ( ) . length )
2020-10-29 02:47:10 +00:00
{
2021-12-06 22:49:05 +00:00
SongLoad . getSong ( ) [ daSection ] . sectionNotes = [ ] ;
2020-10-29 02:47:10 +00:00
}
2020-10-14 01:23:22 +00:00
updateGrid ( ) ;
}
2022-02-06 18:56:18 +00:00
/ * *
* Is true if c l i c k e d a n d p l a c e d a n o t e , s e t r e s e t t o f a l s e w h e n r e l e a s i n g m o u s e b u t t o n !
* /
var justPlacedNote: Bool = false ;
2020-10-13 05:18:50 +00:00
private function addNote ( ) : Void
{
2021-02-11 22:13:50 +00:00
var noteStrum = getStrumTime ( dummyArrow . y ) + sectionStartTime ( ) ;
2020-10-19 02:51:01 +00:00
var noteData = Math . floor ( FlxG . mouse . x / GRID_SIZE ) ;
var noteSus = 0 ;
2022-03-23 05:18:23 +00:00
var noteAlt = " " ;
2020-10-19 02:51:01 +00:00
2022-02-06 18:56:18 +00:00
justPlacedNote = true ;
2021-09-16 04:34:51 +00:00
// FlxG.sound.play(Paths.sound('pianoStuff/piano-00' + FlxG.random.int(1, 9)), FlxG.random.float(0.01, 0.3));
2022-01-26 04:11:43 +00:00
function makeAndPlayChord ( soundsToPlay : Array < String > )
{
var bullshit: Int = Std . int ( ( Math . floor ( dummyArrow . y / GRID_SIZE ) * GRID_SIZE ) / 40 ) ;
soundsToPlay . push ( ' 0 0 ' + Std . string ( ( bullshit % 8 ) + 1 ) ) ;
for ( key in soundsToPlay )
{
var snd: FlxSound = FlxG . sound . list . recycle ( FlxSound ) . loadEmbedded ( FlxG . sound . cache ( Paths . sound ( " p i a n o S t u f f / p i a n o - " + key ) ) ) ;
snd . autoDestroy = true ;
FlxG . sound . list . add ( snd ) ;
snd . volume = FlxG . random . float ( 0.05 , 0.7 ) ;
snd . pan = noteData - 2 ; // .... idk why tf panning doesnt work? (as of 2022/01/25) busted ass bullshit. I only went thru this fuss of creating FlxSound just for the panning!
// snd.proximity(FlxG.mouse.x, FlxG.mouse.y, gridBG, gridBG.width / 2);
snd . play ( ) ;
}
}
2021-09-16 04:34:51 +00:00
switch ( noteData )
{
c ase 0 :
2022-01-26 04:11:43 +00:00
makeAndPlayChord ( [ " 0 1 5 " , " 0 1 3 " , " 0 0 9 " ] ) ;
2021-09-16 04:34:51 +00:00
c ase 1 :
2022-01-26 04:11:43 +00:00
makeAndPlayChord ( [ " 0 1 5 " , " 0 1 2 " , " 0 0 9 " ] ) ;
2021-09-16 04:34:51 +00:00
c ase 2 :
2022-01-26 04:11:43 +00:00
makeAndPlayChord ( [ " 0 1 5 " , " 0 1 1 " , " 0 0 9 " ] ) ;
2021-09-16 04:34:51 +00:00
c ase 3 :
2022-01-26 04:11:43 +00:00
makeAndPlayChord ( [ " 0 1 4 " , " 0 1 1 " , " 0 1 0 " ] ) ;
2021-09-16 04:34:51 +00:00
}
// trace('bullshit $bullshit'); // trace(Math.floor(dummyArrow.y / GRID_SIZE) * GRID_SIZE);
2022-01-21 22:23:12 +00:00
var daNewNote: Note = new Note ( noteStrum , noteData ) ;
2022-01-22 22:06:40 +00:00
daNewNote . data . sustainLength = noteSus ;
2022-01-22 21:58:59 +00:00
daNewNote . data . altNote = noteAlt ;
2022-01-22 21:53:38 +00:00
SongLoad . getSong ( ) [ curSection ] . sectionNotes . push ( daNewNote . data ) ;
2020-10-19 00:59:53 +00:00
2021-12-06 22:49:05 +00:00
curSelectedNote = SongLoad . getSong ( ) [ curSection ] . sectionNotes [ SongLoad . getSong ( ) [ curSection ] . sectionNotes . length - 1 ] ;
2020-10-13 09:55:00 +00:00
2021-01-07 03:38:17 +00:00
if ( FlxG . keys . pressed . CONTROL )
{
2022-01-21 22:23:12 +00:00
// SongLoad.getSong()[curSection].sectionNotes.push([noteStrum, (noteData + 4) % 8, noteSus, noteAlt]);
2021-01-07 03:38:17 +00:00
}
2021-02-11 22:13:50 +00:00
trace ( noteStrum ) ;
2020-10-13 09:55:00 +00:00
trace ( curSection ) ;
2020-10-13 08:07:04 +00:00
updateGrid ( ) ;
2020-10-19 04:01:09 +00:00
updateNoteUI ( ) ;
2020-12-25 09:09:14 +00:00
2022-01-22 21:53:38 +00:00
autosaveSong ( ) ;
2020-10-13 05:18:50 +00:00
}
function getStrumTime ( yPos : Float ) : Float
{
2020-10-13 09:36:45 +00:00
return FlxMath . remapToRange ( yPos , gridBG . y , gridBG . y + gridBG . height , 0 , 16 * Conductor . stepCrochet ) ;
2020-10-13 08:07:04 +00:00
}
2020-10-13 09:55:00 +00:00
function getYfromStrum ( strumTime : Float ) : Float
2020-10-13 08:07:04 +00:00
{
2020-10-13 09:55:00 +00:00
return FlxMath . remapToRange ( strumTime , 0 , 16 * Conductor . stepCrochet , gridBG . y , gridBG . y + gridBG . height ) ;
2020-10-13 05:18:50 +00:00
}
2021-02-11 22:13:50 +00:00
/ *
2021-03-02 04:00:02 +00:00
function calculateSectionLengths ( ? sec : SwagSection ) : Int
2020-10-16 11:03:10 +00:00
{
2021-03-02 04:00:02 +00:00
var daLength: Int = 0 ;
2020-10-16 11:03:10 +00:00
2021-12-06 22:49:05 +00:00
for ( i in SongLoad . getSong ( ) )
2021-03-02 04:00:02 +00:00
{
var swagLength = i . lengthInSteps ;
2020-10-16 11:03:10 +00:00
2021-03-02 04:00:02 +00:00
if ( i . typeOfSection == Section . COPYCAT )
swagLength * 2 ;
2020-10-16 11:03:10 +00:00
2021-03-02 04:00:02 +00:00
daLength += swagLength ;
if ( sec != null && sec == i )
{
trace ( ' s w a g l o o p ? ? ' ) ;
break ;
}
2020-10-16 11:03:10 +00:00
}
2021-03-02 04:00:02 +00:00
return daLength ;
2021-02-11 22:13:50 +00:00
} * /
2020-10-10 09:28:44 +00:00
private var daSpacing: Float = 0.3 ;
2020-10-14 01:44:07 +00:00
function loadLevel ( ) : Void
{
2021-12-06 22:49:05 +00:00
trace ( SongLoad . getSong ( ) ) ;
2020-10-14 01:44:07 +00:00
}
2020-10-13 08:37:19 +00:00
function getNotes ( ) : Array < Dynamic >
2020-10-10 04:22:26 +00:00
{
2020-10-13 08:07:04 +00:00
var noteData: Array < Dynamic > = [ ] ;
2021-12-06 22:49:05 +00:00
for ( i in SongLoad . getSong ( ) )
2020-10-13 08:07:04 +00:00
{
2020-10-19 00:59:53 +00:00
noteData . push ( i . sectionNotes ) ;
2020-10-13 08:07:04 +00:00
}
2020-10-13 08:37:19 +00:00
return noteData ;
}
2020-10-18 01:47:59 +00:00
function loadJson ( song : String ) : Void
{
2022-03-11 06:30:01 +00:00
PlayState . currentSong = SongLoad . loadFromJson ( song . toLowerCase ( ) , song . toLowerCase ( ) ) ;
2021-04-19 08:35:39 +00:00
LoadingState . loadAndSwitchState ( new ChartingState ( ) ) ;
2020-10-18 01:47:59 +00:00
}
2020-12-25 09:09:14 +00:00
function loadAutosave ( ) : Void
{
2022-03-11 06:30:01 +00:00
PlayState . currentSong = FlxG . save . data . autosave ;
2020-12-25 09:09:14 +00:00
FlxG . resetState ( ) ;
}
2020-11-06 09:57:00 +00:00
2020-12-25 09:09:14 +00:00
function autosaveSong ( ) : Void
2020-11-06 09:57:00 +00:00
{
2022-01-22 21:53:38 +00:00
FlxG . save . data . autosave = _song ;
2022-02-06 18:56:18 +00:00
// trace(FlxG.save.data.autosave);
2020-12-25 09:09:14 +00:00
FlxG . save . flush ( ) ;
2020-11-06 09:57:00 +00:00
}
2021-09-02 22:51:08 +00:00
private function saveLevel ( ? debugSavepath : Bool = false )
2020-10-13 08:37:19 +00:00
{
2022-01-26 01:34:21 +00:00
// Right now the note data is saved as a Note.NoteData typedef / object or whatev
// we want to format it to an ARRAY. We turn it back into the typedef / object at the end of this function hehe
2022-02-04 14:25:29 +00:00
for ( key in _song . noteMap . keys ( ) )
SongLoad . castNoteDataToArray ( _song . noteMap [ key ] ) ;
// SongLoad.castNoteDataToArray(_song.notes.easy);
// SongLoad.castNoteDataToArray(_song.notes.normal);
// SongLoad.castNoteDataToArray(_song.notes.hard);
2022-01-26 01:30:29 +00:00
2022-01-26 01:34:21 +00:00
var json = { " s o n g " : _song } ;
2022-01-26 01:30:29 +00:00
var data: String = Json . stringify ( json , null , " \t " ) ;
2020-10-10 04:22:26 +00:00
2021-09-02 22:51:08 +00:00
#if sys
2021-08-10 06:40:47 +00:00
// quick workaround, since it easier to load into hashlink, thus quicker/nicer to test?
// should get this auto-saved into a file or somethin
2021-08-02 18:11:43 +00:00
var filename = _song . song . toLowerCase ( ) ;
2021-09-02 22:51:08 +00:00
if ( debugSavepath )
{
2021-09-02 23:00:01 +00:00
// file path to assumingly your assets folder in your SOURCE CODE assets folder!!!
// update this later so the save button ONLY appears when you compile in debug mode!
2021-09-02 22:51:08 +00:00
sys . io . File . saveContent ( ' . . / . . / . . / . . / a s s e t s / p r e l o a d / d a t a / $ filename / $ filename . j s o n ' , data ) ;
}
e lse
sys . io . File . saveContent ( ' . / $ filename . j s o n ' , data ) ;
2021-08-02 18:11:43 +00:00
#else
2020-10-10 04:22:26 +00:00
if ( ( data != null ) && ( data . length > 0 ) )
{
_file = new FileReference ( ) ;
_file . addEventListener ( Event . COMPLETE , onSaveComplete ) ;
_file . addEventListener ( Event . CANCEL , onSaveCancel ) ;
_file . addEventListener ( IOErrorEvent . IO_ERROR , onSaveError ) ;
2020-10-19 02:18:06 +00:00
_file . save ( data . trim ( ) , _song . song . toLowerCase ( ) + " . j s o n " ) ;
2020-10-10 04:22:26 +00:00
}
2021-08-02 18:11:43 +00:00
#end
2022-01-26 01:30:29 +00:00
2022-02-04 14:25:29 +00:00
for ( key in _song . noteMap . keys ( ) )
SongLoad . castArrayToNoteData ( _song . noteMap [ key ] ) ;
2022-01-26 01:34:21 +00:00
// turn the array data back to Note.NoteData typedef
2022-02-04 14:25:29 +00:00
// SongLoad.castArrayToNoteData(_song.notes.easy);
// SongLoad.castArrayToNoteData(_song.notes.normal);
// SongLoad.castArrayToNoteData(_song.notes.hard);
2020-10-10 02:39:52 +00:00
}
2020-10-10 03:22:07 +00:00
function onSaveComplete ( _ ) : Void
{
_file . removeEventListener ( Event . COMPLETE , onSaveComplete ) ;
_file . removeEventListener ( Event . CANCEL , onSaveCancel ) ;
_file . removeEventListener ( IOErrorEvent . IO_ERROR , onSaveError ) ;
_file = null ;
FlxG . log . notice ( " S u c c e s s f u l l y s a v e d L E V E L D A T A . " ) ;
}
/ * *
* Called when the save file dialog is cancelled .
* /
function onSaveCancel ( _ ) : Void
{
_file . removeEventListener ( Event . COMPLETE , onSaveComplete ) ;
_file . removeEventListener ( Event . CANCEL , onSaveCancel ) ;
_file . removeEventListener ( IOErrorEvent . IO_ERROR , onSaveError ) ;
_file = null ;
}
/ * *
* Called if t h e r e i s a n e r r o r w h i l e s a v i n g t h e g a m e p l a y r e c o r d i n g .
* /
function onSaveError ( _ ) : Void
{
_file . removeEventListener ( Event . COMPLETE , onSaveComplete ) ;
_file . removeEventListener ( Event . CANCEL , onSaveCancel ) ;
_file . removeEventListener ( IOErrorEvent . IO_ERROR , onSaveError ) ;
_file = null ;
FlxG . log . error ( " P r o b l e m s a v i n g L e v e l d a t a " ) ;
}
2020-10-10 02:39:52 +00:00
}
2022-01-21 04:33:51 +00:00
enum SongResetType
{
BEGINNING ;
MEASURE ; // not sure if measure is 1/4 of a "SECTION" which is definitely a... bar.. right? its nerd shit whatever
SECTION ;
}