From 22f56d2c91b135d89d115230cde5da54502a4770 Mon Sep 17 00:00:00 2001 From: NeeEoo Date: Wed, 22 Mar 2023 03:20:36 +0100 Subject: [PATCH 1/7] Fix Cpu Name on older macs --- buildnumber.txt | 2 +- source/funkin/system/framerate/SystemInfo.hx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/buildnumber.txt b/buildnumber.txt index ad12d720..f534e5c3 100644 --- a/buildnumber.txt +++ b/buildnumber.txt @@ -1 +1 @@ -2655 \ No newline at end of file +2656 \ No newline at end of file diff --git a/source/funkin/system/framerate/SystemInfo.hx b/source/funkin/system/framerate/SystemInfo.hx index 1ac8efbd..73bb1e53 100644 --- a/source/funkin/system/framerate/SystemInfo.hx +++ b/source/funkin/system/framerate/SystemInfo.hx @@ -19,7 +19,7 @@ class SystemInfo extends FramerateCategory { var process = new sys.io.Process("wmic", ["cpu", "get", "name"]); if (process.exitCode() == 0) cpuName = process.stdout.readAll().toString().trim().split("\n")[1].trim(); #elseif (mac) - var process = new sys.io.Process("sysctl -a | grep brand"); + var process = new sys.io.Process("sysctl -a | grep brand_string"); if (process.exitCode() == 0) cpuName = process.stdout.readAll().toString().trim().split(":")[1].trim(); #else var process = new sys.io.Process("cat", ["/proc/cpuinfo"]); From 02dc16acc2512f6b7f18b2d9a2222d01f4c31f99 Mon Sep 17 00:00:00 2001 From: Yoshman29 <81191621+YoshiCrafter29@users.noreply.github.com> Date: Wed, 22 Mar 2023 20:49:51 +0100 Subject: [PATCH 2/7] undo & redo --- buildnumber.txt | 2 +- source/funkin/editors/charter/Charter.hx | 116 +++++++++++++++++-- source/funkin/editors/charter/CharterNote.hx | 14 +++ source/funkin/options/Options.hx | 1 + 4 files changed, 121 insertions(+), 12 deletions(-) diff --git a/buildnumber.txt b/buildnumber.txt index f534e5c3..ca573457 100644 --- a/buildnumber.txt +++ b/buildnumber.txt @@ -1 +1 @@ -2656 \ No newline at end of file +2664 \ No newline at end of file diff --git a/source/funkin/editors/charter/Charter.hx b/source/funkin/editors/charter/Charter.hx index 3cbbdbea..801408e1 100644 --- a/source/funkin/editors/charter/Charter.hx +++ b/source/funkin/editors/charter/Charter.hx @@ -1,5 +1,6 @@ package funkin.editors.charter; +import flixel.util.FlxSort; import flixel.math.FlxPoint; import funkin.editors.charter.CharterBackdrop.CharterBackdropDummy; import funkin.system.Conductor; @@ -51,6 +52,9 @@ class Charter extends UIState { public var selection:Array = []; + public var undoList:Array = []; + public var redoList:Array = []; + public function new(song:String, diff:String) { super(); __song = song; @@ -78,10 +82,12 @@ class Charter extends UIState { label: "Edit", childs: [ { - label: "Undo" + label: "Undo", + onSelect: _edit_undo }, { - label: "Redo" + label: "Redo", + onSelect: _edit_redo }, null, { @@ -258,6 +264,7 @@ class Charter extends UIState { note.updatePos(FlxG.keys.pressed.SHIFT ? (mousePos.y / 40) : Std.int(mousePos.y / 40), Std.int(mousePos.x / 40), 0, 0); notesGroup.add(note); selection = [note]; + addToUndo(CPlaceNote(note)); } } if (FlxG.mouse.justReleasedRight) @@ -265,6 +272,88 @@ class Charter extends UIState { } selectionBox.visible = selectionBoxEnabled; } + + public function deleteNote(note:CharterNote):CharterNote { + if (note == null) return note; + + notesGroup.remove(note, true); + note.kill(); + addToUndo(CDeleteNotes([note])); + return null; + } + + public function deleteNotes(notes:Array) { + if (notes.length <= 0) return []; + + for(note in notes) { + notesGroup.remove(note, true); + note.kill(); + } + addToUndo(CDeleteNotes(notes)); + return []; + } + + // UNDO/REDO LOGIC + #if REGION + public inline function addToUndo(c:CharterChange) { + redoList = []; + undoList.insert(0, c); + while(undoList.length > Options.maxUndos) + undoList.pop(); + } + + function _edit_undo() { + selection = []; + var v = undoList.shift(); + switch(v) { + case null: + // do nothing + case CCreateNotes(notes): + for(n in notes) { + notesGroup.remove(n, true); + n.kill(); + } + case CDeleteNotes(notes): + for(n in notes) { + notesGroup.add(n); + n.revive(); + } + sortNotes(); + case CPlaceNote(note): + notesGroup.remove(note, true); + note.kill(); + } + if (v != null) + redoList.insert(0, v); + } + + function _edit_redo() { + selection = []; + var v = redoList.shift(); + switch(v) { + case null: + // do nothing + case CCreateNotes(notes): + for(n in notes) { + notesGroup.add(n); + n.revive(); + } + case CDeleteNotes(notes): + for(n in notes) { + notesGroup.remove(n, true); + n.kill(); + } + case CPlaceNote(note): + notesGroup.add(note); + note.revive(); + } + if (v != null) + undoList.insert(0, v); + } + #end + + public inline function sortNotes() + notesGroup.sort((i, c1, c2) -> FlxSort.byValues(i, c1.step, c2.step), FlxSort.ASCENDING); #end public override function update(elapsed:Float) { // TODO: do optimization like NoteGroup @@ -288,14 +377,14 @@ class Charter extends UIState { if (FlxG.keys.justPressed.DELETE) _edit_delete(); - } - } - public function deleteNote(note:CharterNote):CharterNote { - notesGroup.remove(note, true); - note.kill(); - note.destroy(); - return null; + if (FlxG.keys.pressed.CONTROL) { + if (FlxG.keys.justPressed.Z) + _edit_undo(); + if (FlxG.keys.justPressed.Y) + _edit_redo(); + } + } } @@ -306,8 +395,13 @@ class Charter extends UIState { } function _edit_delete() { if (selection == null) return; - for(s in selection) - deleteNote(s); + selection = deleteNotes(selection); } #end +} + +enum CharterChange { + CPlaceNote(note:CharterNote); + CCreateNotes(notes:Array); + CDeleteNotes(notes:Array); } \ No newline at end of file diff --git a/source/funkin/editors/charter/CharterNote.hx b/source/funkin/editors/charter/CharterNote.hx index d0aaccef..8e87dbc8 100644 --- a/source/funkin/editors/charter/CharterNote.hx +++ b/source/funkin/editors/charter/CharterNote.hx @@ -50,6 +50,20 @@ class CharterNote extends UISprite { }}); } + public override function kill() { + if (angleTween != null) { + angleTween.cancel(); + angle = switch(animation.curAnim.curFrame = (id % 4)) { + case 0: -90; + case 1: 180; + case 2: 0; + case 3: 90; + default: 0; // how is that even possible + }; + } + super.kill(); + } + public override function update(elapsed:Float) { super.update(elapsed); colorTransform.redMultiplier = colorTransform.greenMultiplier = colorTransform.blueMultiplier = selected ? 0.75 : 1; diff --git a/source/funkin/options/Options.hx b/source/funkin/options/Options.hx index 1a14a7a1..30a11f55 100644 --- a/source/funkin/options/Options.hx +++ b/source/funkin/options/Options.hx @@ -37,6 +37,7 @@ class Options */ public static var editorSFX:Bool = true; public static var resizableEditors:Bool = true; + public static var maxUndos:Int = 120; /** * PLAYER 1 CONTROLS From ae14e6e61f8d7f364639d0f1202ec72326ab1ac7 Mon Sep 17 00:00:00 2001 From: Yoshman29 <81191621+YoshiCrafter29@users.noreply.github.com> Date: Wed, 22 Mar 2023 22:10:42 +0100 Subject: [PATCH 3/7] early beta playback + metronome --- assets/images/editors/ui/context-icons.png | Bin 0 -> 737 bytes assets/sounds/editors/charter/hitsound.mp3 | Bin 0 -> 5012 bytes assets/sounds/editors/charter/hitsound.ogg | Bin 0 -> 7942 bytes assets/sounds/editors/charter/metronome.mp3 | Bin 0 -> 1937 bytes assets/sounds/editors/charter/metronome.ogg | Bin 0 -> 4850 bytes buildnumber.txt | 2 +- source/funkin/editors/UIDebugState.hx | 8 +- source/funkin/editors/charter/Charter.hx | 73 +++++++++++++----- source/funkin/editors/ui/UIContextMenu.hx | 4 +- source/funkin/options/Options.hx | 3 + source/funkin/system/Conductor.hx | 19 +---- .../funkin/system/framerate/ConductorInfo.hx | 1 - source/funkin/utils/CoolUtil.hx | 7 ++ 13 files changed, 74 insertions(+), 43 deletions(-) create mode 100644 assets/images/editors/ui/context-icons.png create mode 100644 assets/sounds/editors/charter/hitsound.mp3 create mode 100644 assets/sounds/editors/charter/hitsound.ogg create mode 100644 assets/sounds/editors/charter/metronome.mp3 create mode 100644 assets/sounds/editors/charter/metronome.ogg diff --git a/assets/images/editors/ui/context-icons.png b/assets/images/editors/ui/context-icons.png new file mode 100644 index 0000000000000000000000000000000000000000..73b8ff97642017741a10ddc90ca6bce3fa29c9ca GIT binary patch literal 737 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 H?E(JG8ZUH_(+9f|XF*7e!p`bJ= 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 literal 0 HcmV?d00001 diff --git a/buildnumber.txt b/buildnumber.txt index ca573457..3081bd86 100644 --- a/buildnumber.txt +++ b/buildnumber.txt @@ -1 +1 @@ -2664 \ No newline at end of file +2667 \ No newline at end of file diff --git a/source/funkin/editors/UIDebugState.hx b/source/funkin/editors/UIDebugState.hx index d2179195..e72f6030 100644 --- a/source/funkin/editors/UIDebugState.hx +++ b/source/funkin/editors/UIDebugState.hx @@ -33,7 +33,7 @@ class UIDebugState extends UIState { null, { label: "Exit", - onSelect: () -> {FlxG.switchState(new funkin.menus.MainMenuState());} + onSelect: (t) -> {FlxG.switchState(new funkin.menus.MainMenuState());} } ] }, @@ -107,13 +107,13 @@ class UIDebugState extends UIState { openContextMenu([ { label: "Test 1", - onSelect: function() { + onSelect: function(t) { trace("Test 1 clicked"); } }, { label: "Test 2", - onSelect: function() { + onSelect: function(t) { trace("Test 2 clicked"); } }, @@ -122,7 +122,7 @@ class UIDebugState extends UIState { childs: [ { label: "Test 4", - onSelect: function() { + onSelect: function(t) { trace("Test 4 clicked"); } } diff --git a/source/funkin/editors/charter/Charter.hx b/source/funkin/editors/charter/Charter.hx index 801408e1..3ab00714 100644 --- a/source/funkin/editors/charter/Charter.hx +++ b/source/funkin/editors/charter/Charter.hx @@ -1,5 +1,6 @@ package funkin.editors.charter; +import flixel.system.FlxSound; import flixel.util.FlxSort; import flixel.math.FlxPoint; import funkin.editors.charter.CharterBackdrop.CharterBackdropDummy; @@ -34,6 +35,11 @@ class Charter extends UIState { public var gridBackdrop:CharterBackdrop; public var gridBackdropDummy:CharterBackdropDummy; + public var hitsound:FlxSound; + public var metronome:FlxSound; + + public var vocals:FlxSound; + /** * ACTUAL CHART DATA */ @@ -64,6 +70,8 @@ class Charter extends UIState { public override function create() { super.create(); + trace('Entering Charter for song $__song with difficulty $__diff.'); + topMenu = [ { label: "File", @@ -132,7 +140,8 @@ class Charter extends UIState { label: "Playback", childs: [ { - label: "Play/Pause" + label: "Play/Pause", + onSelect: _playback_play }, null, { @@ -144,13 +153,22 @@ class Charter extends UIState { null, { label: "Go back to the start" + }, + null, + { + label: "Metronome", + onSelect: _playback_metronome + }, + { + label: "Visual metronome" } ] } ]; - trace('Entering Charter for song $__song with difficulty $__diff.'); + hitsound = FlxG.sound.load(Paths.sound('editors/charter/hitsound')); + metronome = FlxG.sound.load(Paths.sound('editors/charter/metronome')); charterCamera = FlxG.camera; uiCamera = new FlxCamera(); @@ -190,6 +208,9 @@ class Charter extends UIState { CoolUtil.loadSong(__song, __diff, false, false); Conductor.setupSong(PlayState.SONG); + + FlxG.sound.music = FlxG.sound.load(Paths.inst(__song, __diff)); + vocals = FlxG.sound.load(Paths.voices(__song, __diff)); for(strID=>strL in PlayState.SONG.strumLines) { for(note in strL.notes) { @@ -200,6 +221,12 @@ class Charter extends UIState { } } + public override function beatHit(curBeat:Int) { + super.beatHit(curBeat); + if (Options.charterMetronomeEnabled) + metronome.replay(); + } + /** * NOTE AND CHARTER GRID LOGIC HERE */ @@ -302,7 +329,7 @@ class Charter extends UIState { undoList.pop(); } - function _edit_undo() { + function _edit_undo(_) { selection = []; var v = undoList.shift(); switch(v) { @@ -327,7 +354,18 @@ class Charter extends UIState { redoList.insert(0, v); } - function _edit_redo() { + function _playback_play(_) { + if (FlxG.sound.music.playing) { + FlxG.sound.music.pause(); + vocals.pause(); + } else { + FlxG.sound.music.time = vocals.time = Conductor.songPosition; + FlxG.sound.music.play(); + vocals.play(); + } + } + + function _edit_redo(_) { selection = []; var v = redoList.shift(); switch(v) { @@ -350,6 +388,10 @@ class Charter extends UIState { if (v != null) undoList.insert(0, v); } + + function _playback_metronome(t) { + t.icon = (Options.charterMetronomeEnabled = !Options.charterMetronomeEnabled) ? 1 : 0; + } #end public inline function sortNotes() @@ -358,7 +400,6 @@ class Charter extends UIState { public override function update(elapsed:Float) { // TODO: do optimization like NoteGroup updateNoteLogic(elapsed); - super.update(elapsed); @@ -366,34 +407,28 @@ class Charter extends UIState { // TODO: canTypeText in case an ui input element is focused if (true) { - if (controls.LEFT) - FlxG.camera.scroll.x -= 250 * elapsed; - if (controls.RIGHT) - FlxG.camera.scroll.x += 250 * elapsed; - if (controls.UP) - FlxG.camera.scroll.y -= 250 * elapsed; - if (controls.DOWN) - FlxG.camera.scroll.y += 250 * elapsed; - if (FlxG.keys.justPressed.DELETE) - _edit_delete(); + _edit_delete(null); if (FlxG.keys.pressed.CONTROL) { if (FlxG.keys.justPressed.Z) - _edit_undo(); + _edit_undo(null); if (FlxG.keys.justPressed.Y) - _edit_redo(); + _edit_redo(null); } + + if (FlxG.keys.justPressed.SPACE) + _playback_play(null); } } // TOP MENU OPTIONS #if REGION - function _file_exit() { + function _file_exit(_) { FlxG.switchState(new CharterSelection()); } - function _edit_delete() { + function _edit_delete(_) { if (selection == null) return; selection = deleteNotes(selection); } diff --git a/source/funkin/editors/ui/UIContextMenu.hx b/source/funkin/editors/ui/UIContextMenu.hx index 449d9e40..e6fad90e 100644 --- a/source/funkin/editors/ui/UIContextMenu.hx +++ b/source/funkin/editors/ui/UIContextMenu.hx @@ -78,7 +78,7 @@ class UIContextMenu extends MusicBeatSubstate { public function select(option:UIContextMenuOption) { var index = options.indexOf(option); if (option.onSelect != null) - option.onSelect(); + option.onSelect(option); if (callback != null) callback(this, index, option); close(); @@ -108,7 +108,7 @@ typedef UIContextMenuCallback = UIContextMenu->Int->UIContextMenuOption->Void; typedef UIContextMenuOption = { var label:String; var ?icon:Int; - var ?onSelect:Void->Void; + var ?onSelect:UIContextMenuOption->Void; var ?childs:Array; } diff --git a/source/funkin/options/Options.hx b/source/funkin/options/Options.hx index 30a11f55..b701614d 100644 --- a/source/funkin/options/Options.hx +++ b/source/funkin/options/Options.hx @@ -39,6 +39,9 @@ class Options public static var resizableEditors:Bool = true; public static var maxUndos:Int = 120; + // CHARTER + public static var charterMetronomeEnabled:Bool = false; + /** * PLAYER 1 CONTROLS */ diff --git a/source/funkin/system/Conductor.hx b/source/funkin/system/Conductor.hx index 0d3c19d9..491b1ccf 100644 --- a/source/funkin/system/Conductor.hx +++ b/source/funkin/system/Conductor.hx @@ -93,9 +93,6 @@ class Conductor @:dox(hide) public static var lastSongPos:Float = 0; - @:dox(hide) public static var lastSongPosTime:Float = 0; - @:dox(hide) public static var speed:Float = 0; - @:dox(hide) public static var destSpeed:Float = 0; @:dox(hide) public static var offset:Float = 0; /** @@ -107,7 +104,6 @@ class Conductor public static function reset() { songPosition = lastSongPos = curBeatFloat = curStepFloat = curBeat = curStep = 0; - speed = 1; bpmChangeMap = []; changeBPM(0); } @@ -154,27 +150,18 @@ class Conductor reset(); } - private static var __timeUntilUpdate:Float; - private static var __elapsedAL:Float; - private static function __updateSongPos(elapsed:Float, mainTime:Float) { + private static function __updateSongPos(elapsed:Float) { if (FlxG.sound.music == null || !FlxG.sound.music.playing) { - speed = destSpeed = 1; lastSongPos = FlxG.sound.music != null ? FlxG.sound.music.time : 0; - lastSongPosTime = mainTime; return; } - var lastPos = lastSongPos; if (lastSongPos != (lastSongPos = FlxG.sound.music.time)) { // update conductor - __timeUntilUpdate = -(lastSongPosTime - (lastSongPosTime = mainTime)); - __elapsedAL = (lastSongPos - lastPos); - destSpeed = FlxMath.bound(__timeUntilUpdate / __elapsedAL, 0.925, 1.075); songPosition = lastSongPos; } else { - songPosition += elapsed * 1000 * speed; + songPosition += elapsed * 1000; } - speed = FlxMath.lerp(speed, destSpeed, FlxMath.bound(elapsed, 0, 1)); } private static function onStateSwitch(newState:FlxState) { @@ -188,7 +175,7 @@ class Conductor private static function update() { if (FlxG.state != null && FlxG.state is MusicBeatState && cast(FlxG.state, MusicBeatState).cancelConductorUpdate) return; - __updateSongPos(FlxG.elapsed, Main.time); + __updateSongPos(FlxG.elapsed); if (bpm > 0) { // updates curbeat and stuff diff --git a/source/funkin/system/framerate/ConductorInfo.hx b/source/funkin/system/framerate/ConductorInfo.hx index 009f3224..2fdfa11c 100644 --- a/source/funkin/system/framerate/ConductorInfo.hx +++ b/source/funkin/system/framerate/ConductorInfo.hx @@ -13,7 +13,6 @@ class ConductorInfo extends FramerateCategory { _text += '\n - ${Conductor.curStep} steps'; _text += '\n - ${Conductor.curMeasure} measures'; _text += '\nCurrent BPM: ${Conductor.bpm}'; - _text += '\nCurrent speed: ${FlxMath.roundDecimal(Conductor.speed, 2)}x'; _text += '\nTime Signature: ${Conductor.beatsPerMesure}/${Conductor.stepsPerBeat}'; this.text.text = _text; diff --git a/source/funkin/utils/CoolUtil.hx b/source/funkin/utils/CoolUtil.hx index 1752362f..d96b3ed3 100644 --- a/source/funkin/utils/CoolUtil.hx +++ b/source/funkin/utils/CoolUtil.hx @@ -1,5 +1,6 @@ package funkin.utils; +import flixel.system.FlxSound; import funkin.system.Conductor; import flixel.system.FlxSoundGroup; import animateatlas.AtlasFrameMaker; @@ -410,6 +411,12 @@ class CoolUtil #end } + public static function replay(sound:FlxSound) { + sound.stop(); + sound.time = 0; + sound.play(); + } + public static inline function maxInt(p1:Int, p2:Int) return p1 < p2 ? p2 : p1; } From d3a681d55a7f1ff71f6e782c0f1d17dd157b1c51 Mon Sep 17 00:00:00 2001 From: Yoshman29 <81191621+YoshiCrafter29@users.noreply.github.com> Date: Wed, 22 Mar 2023 22:43:52 +0100 Subject: [PATCH 4/7] more playback stuff --- assets/sounds/editors/charter/metronome.mp3 | Bin 1937 -> 1989 bytes assets/sounds/editors/charter/metronome.ogg | Bin 4850 -> 4871 bytes buildnumber.txt | 2 +- source/funkin/editors/charter/Charter.hx | 48 ++++++++++++++++++-- 4 files changed, 45 insertions(+), 5 deletions(-) diff --git a/assets/sounds/editors/charter/metronome.mp3 b/assets/sounds/editors/charter/metronome.mp3 index e3e6cb475f49a89d5d8ab14abf41a6bcf13b8e6d..30dbfa8f9205aa128784cd8451d1408202fe36d0 100644 GIT binary patch delta 1087 zcmbQpf0TbhyiXTHFAlI17kGyYOx!3u@c_%jL#nJ@Yi6|WpZM|hBu3Wy|GzIBVPN3e zz}&b+fI)}R`fa)C0*{H49K15MC%t1}50hhHU`S)DVCetw;maH#o1ee_=L7~8Gx`4w z{r~y-|NsAgz{bX=ZvX##a&mGK4Cy~ADk`cRfC?Et{QuGbq!=GQeE*Muq5j9e$6TD& zJS8EStRy=voXh`{`f^JHp5ay?aA9L+v<*-DBzSl-rRe6rGlT& z6)u^Ar^c1@bGJr)>uHoV&3OLh_p9>a*Y@R_m22fsF3(c%&*Zo$usU96LS(7>DV;Ui zOzRe=ty!lV6tycx(ugsNZ|mO1D-8^cReR>>Ijpdj<=V$6Hqqj!TjE>Eml0vR&2|Wj zuC4d}y+T@Z`7frz5HXqB1zA@%&c52GVw4kKP@-I}w3($j^w&Fe9;*$@8N;$=)@;&R zEs(V4uC|wdgTq|U9u2M;O8U1=_j@*Ln*9GaaV2Y5PwJZ!sfRaaMAU!!_581z$n?9% z-u7wr6i!iK6u6VK)b(`LK{XD(1h&Udb8J#s)f8*%!`G}`=yX5Q)1*I*VUits!-K;HFYMYbd{<^3OCJ8@NNfU{9 z8v2R5y;pn&c1KM%ix_SChKO#gXRST*Mgo?|ok z!Q;=_DX_9r^kJ_L3!k-%mUHJL)<+&LCzC8PI(IlK{{NkDfZ5?}8&Q8-zS3JAR$QprtRh%-r08VX`CJi^&bFHb7Z{ aBiEP@FfcBWVPH^TU@!rCg=KOfYcK#4Qv|gD delta 1019 zcmX@gKaqbzyiXXzBpl!XF7Or?n7C1R;sKV4hg4a^@~YymO#JwI5+iH<|KAsmFfedM zFxPGoV9+0yYn+JFbFpEGX(#!vCRXr+1vmB|G?n-savY3FVK9xl(U z%PQOZD(~uVv-h8#RV`YuR=qtv{o~)uE}IVR*)IS8_m|D)8>U5UjDG*LYMt#ho2kiX zHvIqhU1$3p)tg~k|E!%}x;osv|MTzv`@a8|2Zja+{CmCg+uG^Z)*j7FH0F4-%d@@Z zzg9v<_m=~gJ%criU(GP!KAc;>d*3!Q878;F2aii$c?eH7WtwEEYW~?WcWczQ?y14y z_P=VsTJQWifA^F<*ZQAaUK7wV?~>pm#jt&m3Y%W}Pl=c&+87?N+4a<;tE#J)9-OQo zy5M#4gTxCgj@i>r9((dyu&+5;H&*GqBxC!Q^rbbqK6>Yuy$&3aW^@d9e)_wqDc-^-xO?-6nP+AVYz@W7oz*pT#P*n_hdVE$Y0s zK(w_i@=R#zx4P{`rp}^kB6Vkeo^xd$r|O+Mtbr=?(u!PFG9|yd9aNbc-Nsb5f;&cI z*0hBUb6#i(vo)@&`{SC)rL^D%MY-|gGiJ2fvB z)ls)NT?uV^k2inL0-wHJgypDSxAIBfgA!urFbvFMz1@gV!$_NzX1^l_DIU&S4YKYA z?b=Tb{p4h}QpK>B3h1#)_8TtoUmx)-$tzLOf6jkV8UU0pE){)^2 z($^^+Of@aLS4^in$1BQVXNQkxtEZFRKZjBt7HCE;O{TPy*5L9g+16rNTmuLV+pT)@aoNZdrz-KSN0!jOmXAOW-Fr#t( zm)kQc;DuTlyaRYfKFMOu1CGbU_Tal-Y%aq>0z0X*kf e1KMAuz?PJFQxPvBxMz*^Jjk>(9OpOy*R28OVYik5 delta 883 zcmV-(1C0EKCh{d3PiJRS00IC200000003cW00000000QRH2;wrE(~F500031008w9 zWo5BcNDqHuX#fBM0000U=n_;1H8eIc=he2PM!kzClp_Fr1r?DW*FWy(+q&MVV!fyy zb&J!L(57R&`Ew5N@4R0WBS#&(-TqZB&h_CitXBQQ4%OXAo0YzQD#h{1YL>anKb~~w zQ9Csi(6&mdE&oEdrvaDvuUok!uS7-vIY(&#j5>b{76Zu9(1|hSMjB$^;SHj%Q#zb# z2IC9U=}ve>IqY!wc(&RkKfC(QFa|`u;x$nMO%ni|GQFL(s&>aw?qs1{eRGX>3m4H> zJh9ru%aDbB)UnMRj{8l4;aK`{00R>AWz#W;_zKI61>me$J{Q3XJd-&QB7ekW z)to#x>L7e_6Wd73mW+BWXk$|=j8cd5T(F@A%Ct;0i^OM zn?wmR!~ph>_E%oHGT+*>*;jx5bM*fIvo-3oEw|HGSwDEx z5IxhBd_NE6Kcl<2h+qOx>-GBaniybI_8}?&{@G^v)cw3P`59oG5Ej{@pV~>`CY(3T zbO5v1SRxP}DCPI90RY3){V4p5f$b_bt`ClrufY%CInMz0AKFM^!j$7hfLz~ScUK9= J84hsW8UWslup9sY diff --git a/buildnumber.txt b/buildnumber.txt index 3081bd86..196a78e0 100644 --- a/buildnumber.txt +++ b/buildnumber.txt @@ -1 +1 @@ -2667 \ No newline at end of file +2670 \ No newline at end of file diff --git a/source/funkin/editors/charter/Charter.hx b/source/funkin/editors/charter/Charter.hx index 3ab00714..074fd7d3 100644 --- a/source/funkin/editors/charter/Charter.hx +++ b/source/funkin/editors/charter/Charter.hx @@ -34,6 +34,7 @@ class Charter extends UIState { public var topMenuSpr:UITopMenu; public var gridBackdrop:CharterBackdrop; public var gridBackdropDummy:CharterBackdropDummy; + public var conductorFollowerSpr:FlxSprite; public var hitsound:FlxSound; public var metronome:FlxSound; @@ -145,14 +146,17 @@ class Charter extends UIState { }, null, { - label: "Go back a section" + label: "Go back a section", + onSelect: _playback_back }, { - label: "Go forward a section" + label: "Go forward a section", + onSelect: _playback_forward }, null, { - label: "Go back to the start" + label: "Go back to the start", + onSelect: _playback_start }, null, { @@ -185,7 +189,11 @@ class Charter extends UIState { selectionBox.scrollFactor.set(1, 1); selectionBox.incorporeal = true; - selectionBox.cameras = notesGroup.cameras = gridBackdrop.cameras = [charterCamera]; + conductorFollowerSpr = new FlxSprite(0, 0).makeGraphic(1, 1, -1); + conductorFollowerSpr.scale.set(gridBackdrop.strumlinesAmount * 4 * 40, 4); + conductorFollowerSpr.updateHitbox(); + + conductorFollowerSpr.cameras = selectionBox.cameras = notesGroup.cameras = gridBackdrop.cameras = [charterCamera]; topMenuSpr = new UITopMenu(topMenu); @@ -195,6 +203,7 @@ class Charter extends UIState { // adds grid and notes so that they're ALWAYS behind the UI add(gridBackdrop); add(notesGroup); + add(conductorFollowerSpr); add(selectionBox); // add the ui group add(uiGroup); @@ -397,6 +406,8 @@ class Charter extends UIState { public inline function sortNotes() notesGroup.sort((i, c1, c2) -> FlxSort.byValues(i, c1.step, c2.step), FlxSort.ASCENDING); #end + + var __crochet:Float; public override function update(elapsed:Float) { // TODO: do optimization like NoteGroup updateNoteLogic(elapsed); @@ -419,7 +430,24 @@ class Charter extends UIState { if (FlxG.keys.justPressed.SPACE) _playback_play(null); + + __crochet = ((60 / Conductor.bpm) * 1000); + Conductor.songPosition -= __crochet * FlxG.mouse.wheel; + + if (FlxG.keys.justPressed.D) + _playback_forward(null); + if (FlxG.keys.justPressed.A) + _playback_back(null); + if (FlxG.keys.justPressed.HOME) + _playback_start(null); + if (FlxG.keys.justPressed.END) + _playback_end(null); } + + Conductor.songPosition = FlxMath.bound(Conductor.songPosition, 0, FlxG.sound.music.length); + + conductorFollowerSpr.y = curStepFloat * 40; + charterCamera.scroll.set(conductorFollowerSpr.x + conductorFollowerSpr.scale.x - (FlxG.width / 2), conductorFollowerSpr.y - (FlxG.height * 0.25)); } @@ -432,6 +460,18 @@ class Charter extends UIState { if (selection == null) return; selection = deleteNotes(selection); } + function _playback_back(_) { + Conductor.songPosition -= Conductor.beatsPerMesure * __crochet; + } + function _playback_forward(_) { + Conductor.songPosition += Conductor.beatsPerMesure * __crochet; + } + function _playback_start(_) { + Conductor.songPosition = 0; + } + function _playback_end(_) { + Conductor.songPosition = FlxG.sound.music.time; + } #end } From a55e6eba38a463c04bb0dbc0b0ea658ec01c0597 Mon Sep 17 00:00:00 2001 From: Yoshman29 <81191621+YoshiCrafter29@users.noreply.github.com> Date: Wed, 22 Mar 2023 23:37:03 +0100 Subject: [PATCH 5/7] metronome file update --- assets/sounds/editors/charter/metronome.mp3 | Bin 1989 -> 2041 bytes assets/sounds/editors/charter/metronome.ogg | Bin 4871 -> 4867 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/sounds/editors/charter/metronome.mp3 b/assets/sounds/editors/charter/metronome.mp3 index 30dbfa8f9205aa128784cd8451d1408202fe36d0..4a823020b466fe515a6bfa899fc1bf96a23d1df5 100644 GIT binary patch delta 1066 zcmX@g|C4`0yzxGU4jf=JE--OYDC@qp5!?1o{P=njBWwNt-xrQBFmQ=5H*XPO(0*?H zcDv~WkBLhhyfU>Xy<=c^=VxGGFlM%4^#AbT>kc4WPVWEr1O~;2|9?pSfB5+S|Nmd) z=UP)-O0k~m-ViwlP8IxX{J{G z%a%;mjyS3MB%VEYHG?j9NmhziTo#t(De{w;m^O9c62)Z)+EcldSZA&)`<~L*=#!Mx zy6ep~r#0dFYg*0nQ+x&6Zq9GZ-}j||bIYIB=8!dMQGXO#AGGd%GmWw7;mzXWJRhk^ ze?8`G{kb*jTFIr(TAr>g`>LW@R^?>wo30)B^Q?c|Y5Q}1d+Lu_JU-v^xjeJZ);jL1 z>9751clX7d4+#-n@pN16we_fLI|sVdZ6`6EMsR()RL_wJGvXR9j|TQ zU@XAEpdUJU>IqQ>!wWgfI8C~3QdIVbr7v}eJacP{((0(`_jfX zBPjlM*8L?CoSw`7f9adFIw$qbk$V1Xt?mECRnPzO(cmsP_`GFl$p7uOy+y4COae~| zmbxCVIwQu^W5AqwX{Yq8oOK5_tgQbm9DT0(wfYJP*7C0Ag`ML3$L1a8HuV&6I zp~M1ArwKa*r|fomC|MyNQ=oC^pd{ZGhqj8-4;BPY$p7Ht$n4s3uFIX-NbSJ2g%?^j z$#c3CSD3vtkldIku4&>g9LLezc)9)m?}Q^C8~9varvGhWP%<{isGQO_qs61?lB?{}Cp>=UcC2OPF3*2k0{<_| znAys$ma#WESElx)cMR-datsU%X>1h?{U1JjnFD0=^Vk2Jz`$ZA|G%OCKR^Hf|Njrz z*x1zV|9?+TPELX${YOPbMU?|kA;X9NUmAcETqi_@BiWy#itiv&N#tXuOg<{ki}_G9FW^IXCn8B11;t!-5sQZ*jOZIdN64u9cRuGVUyEZ_`1+>vuPn-P@?MF=_k#Q(t59 zuN|MLlb_oDZ}*)|=XZE-TDJAi+UcdML!^)Y{QLiY_5Xfg=zu}#o!?&xR+9#2#=q=6KW}zi7o~SgNQ!d7EWh-H{UooRY_zdoQn4@bkICB~$R!xN?5( z)~Ihijk2a0&%gYBRbKqszFf0%t^CR5SqlD{92W&v$LmapELA_Hvqqa~-NLjr>vV&n zcEv~&nL2SNl|qa^ee0l*^SivowePdZ*4~wP879ShmcXOXo%k7>QM6JJN$9^hC^oqSsYnf zU6lL+ez`g9IGGwer|i&&6M>oGQ7X6lc5a{6xTr8Itx~7>rP`~#`Y#L?uiBBiRG3Hp zV=k9gZdreAy=gtSz+$l0uKd%a_=3K#ZYz9Ag{5d-XR(6U$ z?Db*cvv$#P?tH}h$iwAil0`=64oAiRzY~tUVc@;7GyTtJ1|_i#8I@D`E;4p6DL-Zr z%d2=vBRS~PBu}^aSrda^3d$Z+Vb#)DEC2D7lwFXS7XQs2zgF+{5pj}OJ8c4xw!+wW=A#^#>o@eGXU}N<{B0001+w_ULZHa0gh@z%G@R`rV!2*5#K#qv-Q`TM}s>sz<4cWPcN zs-tdkx)R#-9&i4f1AO{^QCN;TcDws37w7tLZ2V@$4ul#;+N?DD9Wh98@Zz)I)|)}Q z`l+FxoXl3L81_;DZL4Iz;S&G#5xXR>L`DBOM`?cmtWFD84Ma3_VN7--4Y7_4Z^-d= zN(WO-%kCA^>CW+ra@g77muIV|liojyau@@mUU5v6K+^=oLOqQ!s#nEP?qs1{eSM9$ zL0v>&@eQj@ybM|BM-7{EIF_3N!?Etwm*OdSBX1{L^@SYQqSwELCu!vTN= zRRBIl98~7Pjbd47IYE*a;n-(%E*^rj+SL~zd<>v@oAX*dSXaR9Dc0|k(Z Av;Y7A delta 825 zcmV-91IGM=CWj^(PiJRS00IC200000003WW00000008gYV(O6^E(~9500031003+N z<)N`uNDqHsYXATO0001C*SEL_H#avi^VYb;UOlS~K>&`{SC)rL^D%MY-|gGiJ2fvB z)ls)NT?uV^k2inL0-wHJgypDSxAIBfgA!urFbvFMz1@gV!$_NzX1^l_DIU&S4YKYA z?b=Tb{p4h}QpK>B3h1#)_8TtoUmx)-$tzLOf6jkV8UU0pE){)^2 z($^^+Of@aLS4^in$1BQVXNQkxtEZFRKZpF?qgY4s(zC{)2(_pl)WKZ;uof0JbwFB-&%r2}UmTR- zUTyBv2KvAEvyct2(4F|++H(!Q1@b%fWz#W;_zGFe936nL^x$Jv;ZmJH-IU)~=T?(T z7EyD4TVQ9EYCkmxmUlmIS~8%eWV4rj=jcSSg$Rwsbfyk~TZ0OGM=UT00NVY^bB6-} zfLc@m9!4Bg=D|&3S!g*?lY$W@7iKUe^V6B;gTY4l>x2jNS)l397sg*LlfMx_f0t+g zMxVvV^_*>5(7M_D&U1$8N3LIe6HB~{1Kr|-C8peTeGbU_Tal-Y%aq>0z0X*kf1KMAuz?PJFQxPvBxMz*^Jjk>(2OQ@(0N1Sn DROXMm From c2b64d7ec3553d72749c270dc497f54a1d206dd9 Mon Sep 17 00:00:00 2001 From: Yoshman29 <81191621+YoshiCrafter29@users.noreply.github.com> Date: Thu, 23 Mar 2023 12:34:31 +0100 Subject: [PATCH 6/7] GRAAAAAAAAAAAAAAH! selection box bs --- buildnumber.txt | 2 +- source/funkin/editors/charter/Charter.hx | 32 +++++++++++++++++------- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/buildnumber.txt b/buildnumber.txt index 196a78e0..e39b4bbb 100644 --- a/buildnumber.txt +++ b/buildnumber.txt @@ -1 +1 @@ -2670 \ No newline at end of file +2673 \ No newline at end of file diff --git a/source/funkin/editors/charter/Charter.hx b/source/funkin/editors/charter/Charter.hx index 074fd7d3..206107eb 100644 --- a/source/funkin/editors/charter/Charter.hx +++ b/source/funkin/editors/charter/Charter.hx @@ -250,6 +250,8 @@ class Charter extends UIState { if (FlxG.mouse.justReleased) { if (FlxG.keys.pressed.CONTROL) selection.push(n); + else if (FlxG.keys.pressed.SHIFT) + selection.remove(n); else selection = [n]; } @@ -282,16 +284,28 @@ class Charter extends UIState { } if (FlxG.mouse.justReleased) { if (selectionBoxEnabled) { - var minX = Std.int(Math.round(selectionBox.x / 40)); - var minY = Math.round(selectionBox.y / 40) - 1; - var maxX = Std.int(Math.round((selectionBox.x + selectionBox.bWidth) / 40)); - var maxY = Math.round((selectionBox.y + selectionBox.bHeight) / 40); + var minX = Std.int(selectionBox.x / 40); + var minY = Std.int(selectionBox.y / 40); + var maxX = Std.int(Math.ceil((selectionBox.x + selectionBox.bWidth) / 40)); + var maxY = Math.ceil((selectionBox.y + selectionBox.bHeight) / 40); - selection = []; - notesGroup.forEach(function(n) { - if (n.id >= minX && n.id <= maxX && n.step >= minY && n.step <= maxY) - selection.push(n); - }); + if (FlxG.keys.pressed.SHIFT) { + notesGroup.forEach(function(n) { + if (n.id >= minX && n.id < maxX && n.step >= minY && n.step < maxY && selection.contains(n)) + selection.remove(n); + }); + } else if (FlxG.keys.pressed.CONTROL) { + notesGroup.forEach(function(n) { + if (n.id >= minX && n.id < maxX && n.step >= minY && n.step < maxY && !selection.contains(n)) + selection.push(n); + }); + } else { + selection = []; + notesGroup.forEach(function(n) { + if (n.id >= minX && n.id < maxX && n.step >= minY && n.step < maxY) + selection.push(n); + }); + } selectionBoxEnabled = false; } else { From 18c107ab0aa092b608a060647e1ad05e34b93984 Mon Sep 17 00:00:00 2001 From: Yoshman29 <81191621+YoshiCrafter29@users.noreply.github.com> Date: Thu, 23 Mar 2023 12:51:27 +0100 Subject: [PATCH 7/7] git commit number (UNFINISHED) --- buildnumber.txt | 2 +- source/funkin/macros/GitCommitMacro.hx | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 source/funkin/macros/GitCommitMacro.hx diff --git a/buildnumber.txt b/buildnumber.txt index e39b4bbb..d98ffe80 100644 --- a/buildnumber.txt +++ b/buildnumber.txt @@ -1 +1 @@ -2673 \ No newline at end of file +2674 \ No newline at end of file diff --git a/source/funkin/macros/GitCommitMacro.hx b/source/funkin/macros/GitCommitMacro.hx new file mode 100644 index 00000000..b7227ba7 --- /dev/null +++ b/source/funkin/macros/GitCommitMacro.hx @@ -0,0 +1,16 @@ +package funkin.macros; + +class GitCommitMacro { + public static macro function getCommitNumber() { + #if display + return macro $v{0}; + #else + var proc = new Process('git', ['rev-list', 'HEAD', '--count'], false); + proc.exitCode(true); + + var c = Std.parseInt(proc.stdout.readLine()); + trace(c); + return macro $v{c}; + #end + } +} \ No newline at end of file