From d80b7b95cf3e656db79ca3b20c32b8025d6963d6 Mon Sep 17 00:00:00 2001 From: Frakits <90983918+Frakits@users.noreply.github.com> Date: Sun, 29 Mar 2026 13:49:08 +0300 Subject: [PATCH 1/3] selfhosted linux workflow because ubuntu stinks --- .github/workflows/linux-selfhosted.yml | 147 +++++++++++++++++++++++++ 1 file changed, 147 insertions(+) create mode 100644 .github/workflows/linux-selfhosted.yml diff --git a/.github/workflows/linux-selfhosted.yml b/.github/workflows/linux-selfhosted.yml new file mode 100644 index 00000000..e032179c --- /dev/null +++ b/.github/workflows/linux-selfhosted.yml @@ -0,0 +1,147 @@ +name: Linux Builds + +on: + push: + workflow_dispatch: + +jobs: + build: + name: Linux Build + permissions: write-all + runs-on: self-hosted + steps: + - name: Pulling the new commit + uses: actions/checkout@v4 + - name: Setting up Haxe + uses: krdlab/setup-haxe@v2 + with: + haxe-version: 4.3.7 + - name: Restore existing build cache for faster compilation + uses: actions/cache@v4.2.3 + with: + # not caching the bin folder to prevent asset duplication and stuff like that + key: cache-build-linux + path: | + .haxelib/ + export/release/linux/haxe/ + export/release/linux/obj/ + - run: | + echo "HXCPP_COMPILE_CACHE=~/.hxcpp" >> $GITHUB_ENV + - name: Installing LibVLC + run: | + sudo apt-get install libvlc-dev libvlccore-dev + - name: Installing/Updating libraries + run: | + haxe -cp commandline -D analyzer-optimize --run Main setup -s + - name: Building the game + run: | + haxelib run lime build linux -DCOMPILE_EXPERIMENTAL + # - name: Tar files + # run: tar -zcvf CodenameEngine.tar.gz -C export/release/linux/bin . + - name: Uploading artifact (executable) + uses: actions/upload-artifact@v4 + with: + name: Codename Engine (Executable Only) + path: export/release/linux/bin/CodenameEngine + - name: Uploading artifact (entire build) + uses: actions/upload-artifact@v4 + with: + name: Codename Engine + path: export/release/linux/bin/ + - name: Clearing already existing cache + uses: actions/github-script@v6 + with: + script: | + const caches = await github.rest.actions.getActionsCacheList({ + owner: context.repo.owner, + repo: context.repo.repo, + }) + for (const cache of caches.data.actions_caches) { + if (cache.key == "cache-build-linux") { + console.log('Clearing ' + cache.key + '...') + await github.rest.actions.deleteActionsCacheById({ + owner: context.repo.owner, + repo: context.repo.repo, + cache_id: cache.id, + }) + console.log("Cache cleared.") + } + } + - name: Uploading new cache + uses: actions/cache@v4.2.3 + with: + # caching again since for some reason it doesnt work with the first post cache shit + key: cache-build-linux + path: | + .haxelib/ + export/release/linux/haxe/ + export/release/linux/obj/ + +# didnt compile debug in the same job or github would have said that job wasn't completed until debug was done too (debug uploads are not essential) + debug_build: + name: Linux Debug Build + permissions: write-all + runs-on: ubuntu-24.04 + needs: build # since its low priority, it'll run after, so actions will concentrate first on normal builds + steps: + - name: Pulling the new commit + uses: actions/checkout@v4 + - name: Setting up Haxe + uses: krdlab/setup-haxe@v2 + with: + haxe-version: 4.3.7 + - name: Restore existing build cache for faster compilation + uses: actions/cache@v4.2.3 + with: + # not caching the bin folder to prevent asset duplication and stuff like that + key: cache-build-linux-debug + path: | + .haxelib/ + export/debug/linux/haxe/ + export/debug/linux/obj/ + - run: | + echo "HXCPP_COMPILE_CACHE=~/.hxcpp" >> $GITHUB_ENV + - name: Installing LibVLC + run: | + sudo apt-get install libvlc-dev libvlccore-dev + - name: Installing/Updating libraries + run: | + haxe -cp commandline -D analyzer-optimize --run Main setup -s + - name: Building the game + run: | + haxelib run lime build linux -debug + # - name: Tar files + # run: tar -zcvf CodenameEngine.tar.gz -C export/debug/linux/bin . + - name: Uploading artifact (entire build) + uses: actions/upload-artifact@v4 + with: + name: Codename Engine Debug + path: export/debug/linux/bin/ + - name: Clearing already existing cache + uses: actions/github-script@v6 + with: + script: | + const caches = await github.rest.actions.getActionsCacheList({ + owner: context.repo.owner, + repo: context.repo.repo, + }) + for (const cache of caches.data.actions_caches) { + if (cache.key == "cache-build-linux-debug") { + console.log('Clearing ' + cache.key + '...') + await github.rest.actions.deleteActionsCacheById({ + owner: context.repo.owner, + repo: context.repo.repo, + cache_id: cache.id, + }) + console.log("Cache cleared.") + } + } + - name: Uploading new cache + uses: actions/cache@v4.2.3 + with: + # caching again since for some reason it doesnt work with the first post cache shit + key: cache-build-linux-debug + path: | + .haxelib/ + export/debug/linux/haxe/ + export/debug/linux/obj/ From d874ea0348c6bd4b73eb391b169804cc178129a8 Mon Sep 17 00:00:00 2001 From: Bitto Date: Sun, 29 Mar 2026 22:49:11 +0100 Subject: [PATCH 2/3] Fix an oversight with the alphabet getting the wrong width of an component (#937) --- source/funkin/menus/ui/Alphabet.hx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/source/funkin/menus/ui/Alphabet.hx b/source/funkin/menus/ui/Alphabet.hx index 7a4797a0..dd73c00a 100644 --- a/source/funkin/menus/ui/Alphabet.hx +++ b/source/funkin/menus/ui/Alphabet.hx @@ -36,7 +36,7 @@ final class AlphabetComponent { public var cos:Float; public var scaleX:Float; public var scaleY:Float; - + public var flipX:Bool; public var flipY:Bool; @@ -281,7 +281,7 @@ class Alphabet extends FlxSprite { var anim = getLetterAnim(letter, data, __component, i); //if (cantrace) //trace(anim.name + " | " + __component.anim + " | " + frames.frames[anim.frames[0]]); - advance = (Math.isNaN(advance)) ? getAdvance(letter, anim, data) : advance; + advance = (Math.isNaN(advance) && i >= data.startIndex) ? getAdvance(letter, anim, data) : advance; if (anim == null || __renderData.alpha <= 0.0) continue; @@ -551,7 +551,7 @@ class Alphabet extends FlxSprite { angle: angle, cos: angleCos, sin: angleSin, - + flipX: node.get("flipX") == "true", flipY: node.get("flipY") == "true", @@ -607,7 +607,7 @@ class Alphabet extends FlxSprite { angle: angle, cos: angleCos, sin: angleSin, - + flipX: xFlip, flipY: yFlip, @@ -630,7 +630,7 @@ class Alphabet extends FlxSprite { angle: angle, cos: angleCos, sin: angleSin, - + flipX: xFlip, flipY: yFlip, @@ -664,7 +664,7 @@ class Alphabet extends FlxSprite { var xScale:Float = Std.parseFloat(node.get("scaleX")).getDefaultFloat(1.0); var yScale:Float = Std.parseFloat(node.get("scaleY")).getDefaultFloat(1.0); var advance:Float = Std.parseFloat(node.get("advance")); - + var xFlip = node.get("flipX") == "true"; var yFlip = node.get("flipY") == "true"; @@ -685,7 +685,7 @@ class Alphabet extends FlxSprite { angle: angle, cos: angleCos, sin: angleSin, - + flipX: xFlip, flipY: yFlip, From e0b5369eb52ef12fc168a671d7443159ef168fc3 Mon Sep 17 00:00:00 2001 From: Bitto Date: Sun, 29 Mar 2026 22:51:57 +0100 Subject: [PATCH 3/3] "Delete Stacked Notes" functionality for the chart editor (#935) * Delete Stacked Notes * unstack selection * Attempts to translate to italian and polish i do not know these languages so if they're wrong im sorry --- assets/languages/en/Editors.xml | 1 + assets/languages/es/Editors.xml | 3 +- assets/languages/it/Editors.xml | 1 + assets/languages/pl/Editors.xml | 7 +++-- assets/languages/pt/Editors.xml | 1 + source/funkin/editors/charter/Charter.hx | 40 +++++++++++++++++++----- 6 files changed, 41 insertions(+), 12 deletions(-) diff --git a/assets/languages/en/Editors.xml b/assets/languages/en/Editors.xml index f52667b0..c36b63b5 100644 --- a/assets/languages/en/Editors.xml +++ b/assets/languages/en/Editors.xml @@ -203,6 +203,7 @@ Paste Cut Delete + Delete Stacked Notes Chart diff --git a/assets/languages/es/Editors.xml b/assets/languages/es/Editors.xml index 5b5a7e4d..f8f23dd5 100644 --- a/assets/languages/es/Editors.xml +++ b/assets/languages/es/Editors.xml @@ -16,7 +16,7 @@ Animación Atlas Mapa de sprites - + Ubicación ({0}/) {0} {1} Encontrado {0} {1} Encontrados @@ -188,6 +188,7 @@ Pegar Cortar Eliminar + Eliminar Notas Apiladas Chart diff --git a/assets/languages/it/Editors.xml b/assets/languages/it/Editors.xml index 6b5df001..90853b85 100644 --- a/assets/languages/it/Editors.xml +++ b/assets/languages/it/Editors.xml @@ -194,6 +194,7 @@ Incolla Taglia Elimina + Elimina Note Impilate Chart diff --git a/assets/languages/pl/Editors.xml b/assets/languages/pl/Editors.xml index 4af0d432..694e66c3 100644 --- a/assets/languages/pl/Editors.xml +++ b/assets/languages/pl/Editors.xml @@ -18,7 +18,7 @@ Animacja Atlas Mapa sprite'ów - + Folder ({0}/) {0} {1} Znaleziono {0} {1} Znaleziono @@ -87,7 +87,7 @@ Stwórz Grupę Wydarzeń Edytuj Grupę Wydarzeń - + Brak Wydarzenia Struma #{0} ({1}) @@ -197,6 +197,7 @@ Wklej Wytnij Usuń + Usuń Notatki Ułożone w Stos Mapa @@ -223,7 +224,7 @@ Przewiń w Prawo Resetuj Przewinięcie - + Ścieżka Wróć do początku diff --git a/assets/languages/pt/Editors.xml b/assets/languages/pt/Editors.xml index 9704b0e4..aa718df2 100644 --- a/assets/languages/pt/Editors.xml +++ b/assets/languages/pt/Editors.xml @@ -203,6 +203,7 @@ Colar Cortar Apagar + Apagar Notas Empilhadas Mapa diff --git a/source/funkin/editors/charter/Charter.hx b/source/funkin/editors/charter/Charter.hx index f0b451b2..a1c39bf8 100644 --- a/source/funkin/editors/charter/Charter.hx +++ b/source/funkin/editors/charter/Charter.hx @@ -232,6 +232,11 @@ class Charter extends UIState { label: translate("edit.delete"), keybind: [DELETE], onSelect: _edit_delete + }, + { + label: translate("edit.deletestacked"), + keybind: [SHIFT,DELETE], + onSelect: _edit_deletestacked } ] }, @@ -459,7 +464,7 @@ class Charter extends UIState { rightEventsGroup.eventsRowText = rightEventRowText; // thank you neo for pointing out im stupid -lunar - // this is future lunar i completely forgot what neo pointed out but hes awesome go follow him on twitter + // this is future lunar i completely forgot what neo pointed out but hes awesome go follow him on twitter add(gridBackdropDummy = new CameraHoverDummy(gridBackdrops, FlxPoint.weak(1, 0))); selectionBox = new UISliceSprite(0, 0, 2, 2, 'editors/ui/selection'); @@ -978,7 +983,7 @@ class Charter extends UIState { currentCursor = ARROW; } case NONE: - if (FlxG.mouse.justPressed) + if (FlxG.mouse.justPressed) FlxG.mouse.getWorldPosition(charterCamera, dragStartPos); else if (FlxG.mouse.justPressedRight) { closeCurrentContextMenu(); @@ -1719,6 +1724,25 @@ class Charter extends UIState { selection = deleteSelection(selection, true); } + function _edit_deletestacked(_) { + UIState.playEditorSound(Flags.DEFAULT_EDITOR_DELETE_SOUND); + if (notesGroup.members.length == 0) return; + var oldNote:CharterNote = null; + var selectionArray:Array = ((selection.length != 0) ? selection : notesGroup.members.copy()); + var toDelete:Selection = new Selection(); + for (note in selectionArray) { + if (oldNote != null && oldNote.step == note.step && oldNote.strumLineID == note.strumLineID && oldNote.id == note.id) { + noteDeleteAnims.deleteNotes.push({note: oldNote, time: noteDeleteAnims.deleteTime}); + toDelete.push(oldNote); + } + oldNote = note; + } + if (toDelete.length != 0) { + deleteSelection(toDelete); + if (selection.length != 0) for (i in toDelete) selection.remove(i); //crash prevention + } + } + function _undo(undo:CharterChange) { UIState.playEditorSound(Flags.DEFAULT_EDITOR_UNDO_SOUND); switch(undo) { @@ -1955,7 +1979,7 @@ class Charter extends UIState { if (PlayState.SONG.bookmarks != null) bookmarks = PlayState.SONG.bookmarks; } catch (e) {} - + return bookmarks; } @@ -1965,9 +1989,9 @@ class Charter extends UIState { var currentBookmarks:Array = getBookmarkList(); var newBookmarks:Array = getBookmarkList(); newBookmarks.push({time: daStep, name: name, color: color.toWebString()}); - + PlayState.SONG.bookmarks = newBookmarks; - updateBookmarks(); + updateBookmarks(); undos.addToUndo(CEditBookmarks(currentBookmarks, newBookmarks)); } @@ -1992,7 +2016,7 @@ class Charter extends UIState { { var bars:Array = bs[0]; var text:UIText = bs[1]; - + if (bars != null) { for (spr in bars) { if (spr == null) continue; @@ -2046,7 +2070,7 @@ class Charter extends UIState { 0, scrollBar.height ); - + var bookmarkspr = new FlxSprite(scrollBar.x - 10, yPos).makeSolid(40, 4, bookmarkcolor); uiGroup.add(bookmarkspr); sprites.push(bookmarkspr); @@ -2330,7 +2354,7 @@ class Charter extends UIState { icon: this.noteType == 0 ? 1 : 0 }]; - final noteKeys:Array>> = [[[ZERO], [NUMPADZERO]], [[ONE], [NUMPADONE]], [[TWO], [NUMPADTWO]], [[THREE], [NUMPADTHREE]], [[FOUR], [NUMPADFOUR]], [[FIVE], [NUMPADFIVE]], + final noteKeys:Array>> = [[[ZERO], [NUMPADZERO]], [[ONE], [NUMPADONE]], [[TWO], [NUMPADTWO]], [[THREE], [NUMPADTHREE]], [[FOUR], [NUMPADFOUR]], [[FIVE], [NUMPADFIVE]], [[SIX], [NUMPADSIX]], [[SEVEN], [NUMPADSEVEN]], [[EIGHT], [NUMPADEIGHT]], [[NINE], [NUMPADNINE]]]; for (i=>type in noteTypes) { var realNoteID:Int = i+1; // Default Note not stored