From fc1a05f276f99dd7239d5be377f4ad68dc818aa1 Mon Sep 17 00:00:00 2001 From: MightyTheArmiddilo Date: Mon, 6 Oct 2025 07:22:18 -0700 Subject: [PATCH 01/13] Character preview --- .../ui/debug/charting/ChartEditorState.hx | 207 +++++++++++++++--- .../ChartEditorCharacterIconSelectorMenu.hx | 8 +- .../toolboxes/ChartEditorDifficultyToolbox.hx | 2 + .../ui/haxeui/components/CharacterPlayer.hx | 61 ++++-- 4 files changed, 232 insertions(+), 46 deletions(-) diff --git a/source/funkin/ui/debug/charting/ChartEditorState.hx b/source/funkin/ui/debug/charting/ChartEditorState.hx index cda0f8b54a5..b46a5f0e4c7 100644 --- a/source/funkin/ui/debug/charting/ChartEditorState.hx +++ b/source/funkin/ui/debug/charting/ChartEditorState.hx @@ -97,6 +97,7 @@ import haxe.ui.components.Button; import haxe.ui.components.DropDown; import haxe.ui.components.Label; import haxe.ui.components.Slider; +import haxe.ui.components.NumberStepper; import haxe.ui.containers.dialogs.CollapsibleDialog; import haxe.ui.containers.menus.Menu; import haxe.ui.containers.menus.MenuBar; @@ -629,6 +630,8 @@ class ChartEditorState extends UIState // UIState derives from MusicBeatState this.scrollPositionInPixels = this.scrollPositionInPixels; // Characters have probably changed too. healthIconsDirty = true; + playerPreviewDirty = true; + opponentPreviewDirty = true; return isViewDownscroll; } @@ -666,6 +669,42 @@ class ChartEditorState extends UIState // UIState derives from MusicBeatState */ var currentOpponentCharacterPlayer:Null = null; + /** + * The character scale in the Player Preview window. + * `null` until accessed. + */ + var currentPlayerPreviewScale:Null = null; + + /** + * The character scale in the Opponent Preview window. + * `null` until accessed. + */ + var currentOpponentPreviewScale:Null = null; + + /** + * The character X in the Player Preview window. + * `null` until accessed. + */ + var currentPlayerPreviewX:Null = null; + + /** + * The character X in the Opponent Preview window. + * `null` until accessed. + */ + var currentOpponentPreviewX:Null = null; + + /** + * The character Y in the Player Preview window. + * `null` until accessed. + */ + var currentPlayerPreviewY:Null = null; + + /** + * The character Y in the Opponent Preview window. + * `null` until accessed. + */ + var currentOpponentPreviewY:Null = null; + // HaxeUI /** @@ -3277,8 +3316,14 @@ class ChartEditorState extends UIState // UIState derives from MusicBeatState menubarItemToggleToolboxEventData.onChange = event -> this.setToolboxState(CHART_EDITOR_TOOLBOX_EVENT_DATA_LAYOUT, event.value); menubarItemToggleToolboxFreeplay.onChange = event -> this.setToolboxState(CHART_EDITOR_TOOLBOX_FREEPLAY_LAYOUT, event.value); menubarItemToggleToolboxPlaytestProperties.onChange = event -> this.setToolboxState(CHART_EDITOR_TOOLBOX_PLAYTEST_PROPERTIES_LAYOUT, event.value); - menubarItemToggleToolboxPlayerPreview.onChange = event -> this.setToolboxState(CHART_EDITOR_TOOLBOX_PLAYER_PREVIEW_LAYOUT, event.value); - menubarItemToggleToolboxOpponentPreview.onChange = event -> this.setToolboxState(CHART_EDITOR_TOOLBOX_OPPONENT_PREVIEW_LAYOUT, event.value); + menubarItemToggleToolboxPlayerPreview.onChange = event -> { + this.setToolboxState(CHART_EDITOR_TOOLBOX_PLAYER_PREVIEW_LAYOUT, event.value); + playerPreviewDirty = event.value; + }; + menubarItemToggleToolboxOpponentPreview.onChange = event -> { + this.setToolboxState(CHART_EDITOR_TOOLBOX_OPPONENT_PREVIEW_LAYOUT, event.value); + opponentPreviewDirty = event.value; + }; // TODO: Pass specific HaxeUI components to add context menus to them. // registerContextMenu(null, Paths.ui('chart-editor/context/test')); @@ -3601,7 +3646,7 @@ class ChartEditorState extends UIState // UIState derives from MusicBeatState var oldStepTime:Float = Conductor.instance.currentStepTime; var oldSongPosition:Float = Conductor.instance.songPosition + Conductor.instance.instrumentalOffset; updateSongTime(); - handleHitsounds(oldSongPosition, Conductor.instance.songPosition + Conductor.instance.instrumentalOffset); + handleHitNotes(oldSongPosition, Conductor.instance.songPosition + Conductor.instance.instrumentalOffset); // Resync vocals. if (Math.abs(audioInstTrack.time - audioVocalTrackGroup.time) > 100) { @@ -3619,7 +3664,7 @@ class ChartEditorState extends UIState // UIState derives from MusicBeatState // Else, move the entire view. var oldSongPosition:Float = Conductor.instance.songPosition + Conductor.instance.instrumentalOffset; updateSongTime(); - handleHitsounds(oldSongPosition, Conductor.instance.songPosition + Conductor.instance.instrumentalOffset); + handleHitNotes(oldSongPosition, Conductor.instance.songPosition + Conductor.instance.instrumentalOffset); // Resync vocals. if (Math.abs(audioInstTrack.time - audioVocalTrackGroup.time) > 100) { @@ -5309,8 +5354,8 @@ class ChartEditorState extends UIState // UIState derives from MusicBeatState function handleToolboxes():Void { handleDifficultyToolbox(); - // handlePlayerPreviewToolbox(); - // handleOpponentPreviewToolbox(); + handlePlayerPreviewToolbox(); + handleOpponentPreviewToolbox(); } function handleDifficultyToolbox():Void @@ -5337,15 +5382,43 @@ class ChartEditorState extends UIState // UIState derives from MusicBeatState if (charPreviewToolbox == null) return; // TODO: Re-enable the player preview once we figure out the performance issues. - var charPlayer:Null = null; // charPreviewToolbox.findComponent('charPlayer'); + var charPlayer:Null = charPreviewToolbox.findComponent('charPlayer'); if (charPlayer == null) return; - currentPlayerCharacterPlayer = charPlayer; + var charPreviewScale:Null = charPreviewToolbox.findComponent('charPreviewScale'); + if (charPreviewScale == null) return; + + var charPreviewX:Null = charPreviewToolbox.findComponent('charPreviewX'); + if (charPreviewX == null) return; + + var charPreviewY:Null = charPreviewToolbox.findComponent('charPreviewY'); + if (charPreviewY == null) return; if (playerPreviewDirty) { playerPreviewDirty = false; + charPreviewScale.onChange = event -> { + currentPlayerCharacterPlayer.targetScale = event.value; + playerPreviewDirty = true; + } + + currentPlayerPreviewScale = charPreviewScale; + + charPreviewX.onChange = event -> { + currentPlayerCharacterPlayer.xOffset = event.value; + playerPreviewDirty = true; + } + + currentPlayerPreviewX = charPreviewX; + + charPreviewY.onChange = event -> { + currentPlayerCharacterPlayer.yOffset = event.value; + playerPreviewDirty = true; + } + + currentPlayerPreviewY = charPreviewY; + if (currentSongMetadata.playData.characters.player != charPlayer.charId) { if (healthIconBF != null) @@ -5357,15 +5430,26 @@ class ChartEditorState extends UIState // UIState derives from MusicBeatState charPlayer.characterType = CharacterType.BF; charPlayer.flip = true; charPlayer.targetScale = 0.5; + currentPlayerPreviewScale.pos = 0.5; + charPlayer.xOffset = 0; + currentPlayerPreviewX.pos = 0; + charPlayer.yOffset = 0; + currentPlayerPreviewY.pos = 0; + charPreviewToolbox.invalidateComponentLayout(); charPreviewToolbox.title = 'Player Preview - ${charPlayer.charName}'; } - if (charPreviewToolbox != null && !charPreviewToolbox.minimized) - { - charPreviewToolbox.width = charPlayer.width + 32; - charPreviewToolbox.height = charPlayer.height + 64; - } + currentPlayerCharacterPlayer = charPlayer; + } + + if (charPreviewToolbox != null && !charPreviewToolbox.minimized) + { + charPreviewToolbox.width = (currentPlayerCharacterPlayer.width > currentPlayerPreviewScale.width) ? currentPlayerCharacterPlayer.width + + 32 : currentPlayerPreviewScale.width + + 32; + charPreviewToolbox.height = currentPlayerCharacterPlayer.height + currentPlayerPreviewScale.height + currentPlayerPreviewX.height + + currentPlayerPreviewY.height + 64; } } @@ -5376,15 +5460,43 @@ class ChartEditorState extends UIState // UIState derives from MusicBeatState if (charPreviewToolbox == null) return; // TODO: Re-enable the player preview once we figure out the performance issues. - var charPlayer:Null = null; // charPreviewToolbox.findComponent('charPlayer'); + var charPlayer:Null = charPreviewToolbox.findComponent('charPlayer'); if (charPlayer == null) return; - currentOpponentCharacterPlayer = charPlayer; + var charPreviewScale:Null = charPreviewToolbox.findComponent('charPreviewScale'); + if (charPreviewScale == null) return; + + var charPreviewX:Null = charPreviewToolbox.findComponent('charPreviewX'); + if (charPreviewX == null) return; + + var charPreviewY:Null = charPreviewToolbox.findComponent('charPreviewY'); + if (charPreviewY == null) return; if (opponentPreviewDirty) { opponentPreviewDirty = false; + charPreviewScale.onChange = event -> { + currentOpponentCharacterPlayer.targetScale = event.value; + opponentPreviewDirty = true; + } + + currentOpponentPreviewScale = charPreviewScale; + + charPreviewX.onChange = event -> { + currentOpponentCharacterPlayer.xOffset = event.value; + opponentPreviewDirty = true; + } + + currentOpponentPreviewX = charPreviewX; + + charPreviewY.onChange = event -> { + currentOpponentCharacterPlayer.yOffset = event.value; + opponentPreviewDirty = true; + } + + currentOpponentPreviewY = charPreviewY; + if (currentSongMetadata.playData.characters.opponent != charPlayer.charId) { if (healthIconDad != null) @@ -5396,15 +5508,27 @@ class ChartEditorState extends UIState // UIState derives from MusicBeatState charPlayer.characterType = CharacterType.DAD; charPlayer.flip = false; charPlayer.targetScale = 0.5; + currentOpponentPreviewScale.pos = 0.5; + charPlayer.xOffset = 0; + currentOpponentPreviewX.pos = 0; + charPlayer.yOffset = 0; + currentOpponentPreviewY.pos = 0; + charPreviewToolbox.invalidateComponentLayout(); charPreviewToolbox.title = 'Opponent Preview - ${charPlayer.charName}'; } - if (charPreviewToolbox != null && !charPreviewToolbox.minimized) - { - charPreviewToolbox.width = charPlayer.width + 32; - charPreviewToolbox.height = charPlayer.height + 64; - } + currentOpponentCharacterPlayer = charPlayer; + } + + if (charPreviewToolbox != null && !charPreviewToolbox.minimized) + { + charPreviewToolbox.width = (currentOpponentCharacterPlayer.width > currentOpponentPreviewScale.width) ? currentOpponentCharacterPlayer.width + + 32 : currentOpponentPreviewScale.width + + 32; + charPreviewToolbox.height = currentOpponentCharacterPlayer.height + currentOpponentPreviewScale.height + currentOpponentPreviewX.height + + currentOpponentPreviewY.height + 64; + charPreviewToolbox.invalidateComponentLayout(); } } @@ -6126,7 +6250,7 @@ class ChartEditorState extends UIState // UIState derives from MusicBeatState } PlayStatePlaylist.reset(); - + // TODO: Rework asset system so we can remove this jank. switch (currentSongStage) { @@ -6735,10 +6859,8 @@ class ChartEditorState extends UIState // UIState derives from MusicBeatState /** * Handle the playback of hitsounds. */ - function handleHitsounds(oldSongPosition:Float, newSongPosition:Float):Void + function handleHitNotes(oldSongPosition:Float, newSongPosition:Float):Void { - if (!hitsoundsEnabled) return; - // Assume notes are sorted by time. for (noteData in currentSongChartNoteData) { @@ -6748,7 +6870,7 @@ class ChartEditorState extends UIState // UIState derives from MusicBeatState continue; if (noteData.time > newSongPosition) // Note is in the future. - return; // Assume all notes are also in the future. + break; // Assume all notes are also in the future. // Note was just hit. @@ -6765,7 +6887,7 @@ class ChartEditorState extends UIState // UIState derives from MusicBeatState if (event.eventCanceled) continue; // Hitsounds. - switch (noteData.getStrumlineIndex()) + if (hitsoundsEnabled) switch (noteData.getStrumlineIndex()) { case 0: // Player if (hitsoundVolumePlayer > 0) this.playSound(Paths.sound('chartingSounds/hitNotePlayer'), hitsoundVolumePlayer); @@ -6773,6 +6895,37 @@ class ChartEditorState extends UIState // UIState derives from MusicBeatState if (hitsoundVolumeOpponent > 0) this.playSound(Paths.sound('chartingSounds/hitNoteOpponent'), hitsoundVolumeOpponent); } } + + for (eventData in currentSongChartEventData) + { + // Check for events between the old and new song positions. + + if (eventData.time < oldSongPosition) // Event is in the past. + continue; + + if (eventData.time > newSongPosition) // Event is in the future. + break; // Assume all events are also in the future. + + // Event was just hit. + + // Character preview. + + switch (eventData.eventKind) + { + case "PlayAnimation": + var target = null; + switch (eventData.getString("target")) + { + case 'boyfriend' | 'bf' | 'player': + target = currentPlayerCharacterPlayer; + case 'dad' | 'opponent': + target = currentOpponentCharacterPlayer; + default: + } + if (target.character != null) target.character.playAnimation(eventData.getString("anim") ?? "idle", eventData.getBool("force") ?? false); + default: + } + } } function stopAudioPlayback():Void @@ -6842,6 +6995,8 @@ class ChartEditorState extends UIState // UIState derives from MusicBeatState // Many things get reset when song length changes. healthIconsDirty = true; + playerPreviewDirty = true; + opponentPreviewDirty = true; } public function postLoadVocals():Void diff --git a/source/funkin/ui/debug/charting/dialogs/ChartEditorCharacterIconSelectorMenu.hx b/source/funkin/ui/debug/charting/dialogs/ChartEditorCharacterIconSelectorMenu.hx index feaf307eaa4..d8af4ef0bd6 100644 --- a/source/funkin/ui/debug/charting/dialogs/ChartEditorCharacterIconSelectorMenu.hx +++ b/source/funkin/ui/debug/charting/dialogs/ChartEditorCharacterIconSelectorMenu.hx @@ -115,9 +115,13 @@ class ChartEditorCharacterIconSelectorMenu extends ChartEditorBaseMenu charButton.onClick = _ -> { switch (charType) { - case BF: chartEditorState.currentSongMetadata.playData.characters.player = charId; + case BF: + chartEditorState.currentSongMetadata.playData.characters.player = charId; + chartEditorState.playerPreviewDirty = true; case GF: chartEditorState.currentSongMetadata.playData.characters.girlfriend = charId; - case DAD: chartEditorState.currentSongMetadata.playData.characters.opponent = charId; + case DAD: + chartEditorState.currentSongMetadata.playData.characters.opponent = charId; + chartEditorState.opponentPreviewDirty = true; default: throw 'Invalid charType: ' + charType; }; diff --git a/source/funkin/ui/debug/charting/toolboxes/ChartEditorDifficultyToolbox.hx b/source/funkin/ui/debug/charting/toolboxes/ChartEditorDifficultyToolbox.hx index 2fe108df527..6373f22fae7 100644 --- a/source/funkin/ui/debug/charting/toolboxes/ChartEditorDifficultyToolbox.hx +++ b/source/funkin/ui/debug/charting/toolboxes/ChartEditorDifficultyToolbox.hx @@ -141,6 +141,8 @@ class ChartEditorDifficultyToolbox extends ChartEditorBaseToolbox { chartEditorState.currentSongMetadata = songMetadata; chartEditorState.healthIconsDirty = true; + chartEditorState.playerPreviewDirty = true; + chartEditorState.opponentPreviewDirty = true; chartEditorState.refreshToolbox(ChartEditorState.CHART_EDITOR_TOOLBOX_METADATA_LAYOUT); chartEditorState.success('Replaced Metadata', 'Replaced metadata with file (${fileReference.name})'); } diff --git a/source/funkin/ui/haxeui/components/CharacterPlayer.hx b/source/funkin/ui/haxeui/components/CharacterPlayer.hx index dbe537fc3bc..1fb40399a13 100644 --- a/source/funkin/ui/haxeui/components/CharacterPlayer.hx +++ b/source/funkin/ui/haxeui/components/CharacterPlayer.hx @@ -31,7 +31,7 @@ typedef AnimationInfo = @:composite(Layout) class CharacterPlayer extends Box { - var character:Null; + public var character:Null; public function new(defaultToBf:Bool = true) { @@ -99,14 +99,10 @@ class CharacterPlayer extends Box // Set character properties. if (characterType != null) character.characterType = characterType; if (flip) character.flipX = !character.flipX; - if (targetScale != 1.0) character.setScale(targetScale); - - character.animation.onFrameChange.add(function(name:String = '', frameNumber:Int = -1, frameIndex:Int = -1) { - dispatch(new AnimationEvent(AnimationEvent.FRAME)); - }); - character.animation.onFinish.add(function(name:String = '') { - dispatch(new AnimationEvent(AnimationEvent.END)); - }); + if (targetScale != 1.0) character.setScale(character.isPixel ? targetScale * Constants.PIXEL_ART_SCALE : targetScale); + + character.animation.onFrameChange.add(onFrame); + character.animation.onFinish.add(onFinish); add(character); invalidateComponentLayout(); @@ -154,12 +150,40 @@ class CharacterPlayer extends Box if (character != null) { - character.setScale(value); + character.setScale(character.isPixel ? value * Constants.PIXEL_ART_SCALE : value); } return targetScale = value; } + public var xOffset(default, set):Float = 0; + + function set_xOffset(value:Float):Float + { + if (value == xOffset) return value; + + if (character != null) + { + character.x = this.cachedScreenX + xOffset; + } + + return xOffset = value; + } + + public var yOffset(default, set):Float = 0; + + function set_yOffset(value:Float):Float + { + if (value == yOffset) return value; + + if (character != null) + { + character.y = this.cachedScreenY + yOffset; + } + + return yOffset = value; + } + function onFrame(name:String, frameNumber:Int, frameIndex:Int):Void { dispatch(new AnimationEvent(AnimationEvent.FRAME)); @@ -173,14 +197,9 @@ class CharacterPlayer extends Box override function repositionChildren():Void { super.repositionChildren(); - character.x = this.cachedScreenX; - character.y = this.cachedScreenY; - - // Apply animation offsets, so the character is positioned correctly based on the animation. - @:privateAccess var animOffsets:Array = character.animOffsets; - character.x -= animOffsets[0] * targetScale * (flip ? -1 : 1); - character.y -= animOffsets[1] * targetScale; + character.x = this.cachedScreenX + xOffset; + character.y = this.cachedScreenY + yOffset; } /** @@ -225,7 +244,13 @@ class CharacterPlayer extends Box */ public function onNoteHit(event:HitNoteScriptEvent):Void { - if (character != null) character.onNoteHit(event); + if (character != null) + { + character.onNoteHit(event); + + if ((event.note.noteData.getMustHitNote() && characterType == BF) + || (!event.note.noteData.getMustHitNote() && characterType == DAD)) character.holdTimer = event.note.noteData.length / -1000; + } } /** From 7c4810dd5f85b9c52a13aae8df19b98eed60c499 Mon Sep 17 00:00:00 2001 From: MightyTheArmiddilo Date: Mon, 6 Oct 2025 07:41:50 -0700 Subject: [PATCH 02/13] character preview --- assets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets b/assets index d2d15f11425..07c8c506cd0 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit d2d15f114256125d53c6331b46415701ae291c1f +Subproject commit 07c8c506cd047c0aa7afdaa1d43106f7748fbe57 From f64889f0589f1857071bd112d2be6ca9f17df856 Mon Sep 17 00:00:00 2001 From: MightyTheArmiddilo Date: Mon, 6 Oct 2025 22:14:36 -0700 Subject: [PATCH 03/13] Character preview --- assets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets b/assets index 07c8c506cd0..a7ba09b7650 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit 07c8c506cd047c0aa7afdaa1d43106f7748fbe57 +Subproject commit a7ba09b7650eab57b667b0905ca175884ad35239 From 42545e7b8da92b246b9d893c95027c72000b1127 Mon Sep 17 00:00:00 2001 From: MightyTheArmiddilo Date: Mon, 6 Oct 2025 22:22:58 -0700 Subject: [PATCH 04/13] push to newer version --- art | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/art b/art index f50c6ccac56..094ff109197 160000 --- a/art +++ b/art @@ -1 +1 @@ -Subproject commit f50c6ccac56bc729aed7046c6e590fb86ad36b08 +Subproject commit 094ff109197e35d21342bdf2d51132be23948d3f From 379f7ce08b3bf965ad2e248d5b16d7477fb084ad Mon Sep 17 00:00:00 2001 From: MightyTheArmiddilo Date: Mon, 6 Oct 2025 22:34:00 -0700 Subject: [PATCH 05/13] push art --- art | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/art b/art index 094ff109197..f50c6ccac56 160000 --- a/art +++ b/art @@ -1 +1 @@ -Subproject commit 094ff109197e35d21342bdf2d51132be23948d3f +Subproject commit f50c6ccac56bc729aed7046c6e590fb86ad36b08 From 8da762994228d75fba56b93cca283d33ec2bbb13 Mon Sep 17 00:00:00 2001 From: MightyTheArmiddilo Date: Wed, 8 Oct 2025 17:12:41 -0700 Subject: [PATCH 06/13] fix assets --- assets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets b/assets index a7ba09b7650..7f47f1d57dd 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit a7ba09b7650eab57b667b0905ca175884ad35239 +Subproject commit 7f47f1d57dd2e04d16024f13041c8aeb5d65b8d3 From 63d69c0b470af72e46d562e5f57f9bbb7e39d1d0 Mon Sep 17 00:00:00 2001 From: MightyTheArmiddilo Date: Wed, 8 Oct 2025 17:14:16 -0700 Subject: [PATCH 07/13] fix assets --- assets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets b/assets index 7f47f1d57dd..a7ba09b7650 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit 7f47f1d57dd2e04d16024f13041c8aeb5d65b8d3 +Subproject commit a7ba09b7650eab57b667b0905ca175884ad35239 From 9ab978d664068137fc828765225a244af8454f12 Mon Sep 17 00:00:00 2001 From: MightyTheArmiddilo Date: Wed, 8 Oct 2025 17:38:56 -0700 Subject: [PATCH 08/13] fix assets --- assets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets b/assets index 7f47f1d57dd..af8c4acff56 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit 7f47f1d57dd2e04d16024f13041c8aeb5d65b8d3 +Subproject commit af8c4acff56235fd6076116ee2ffa04277dde302 From 148d89d551e12458a9424ae81daba1a2cb2e08b8 Mon Sep 17 00:00:00 2001 From: MightyTheArmiddilo Date: Wed, 8 Oct 2025 18:14:22 -0700 Subject: [PATCH 09/13] idrk what's happening anymore but maybe this fixes it --- assets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets b/assets index af8c4acff56..a7ba09b7650 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit af8c4acff56235fd6076116ee2ffa04277dde302 +Subproject commit a7ba09b7650eab57b667b0905ca175884ad35239 From 00dc5114a96dfec8408571a87d48e0e1dd902768 Mon Sep 17 00:00:00 2001 From: MightyTheArmiddilo Date: Wed, 8 Oct 2025 18:24:07 -0700 Subject: [PATCH 10/13] im gonna cry --- assets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets b/assets index a7ba09b7650..af8c4acff56 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit a7ba09b7650eab57b667b0905ca175884ad35239 +Subproject commit af8c4acff56235fd6076116ee2ffa04277dde302 From d9ab9c5059b6db8fe66188c6e0775f5d83792906 Mon Sep 17 00:00:00 2001 From: MightyTheArmiddilo Date: Wed, 8 Oct 2025 18:26:26 -0700 Subject: [PATCH 11/13] crap run that back --- assets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets b/assets index af8c4acff56..a7ba09b7650 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit af8c4acff56235fd6076116ee2ffa04277dde302 +Subproject commit a7ba09b7650eab57b667b0905ca175884ad35239 From 128c2a1caeff4b6d69189ba541d2ba06ef052ad5 Mon Sep 17 00:00:00 2001 From: MightyTheArmiddilo Date: Wed, 8 Oct 2025 18:39:55 -0700 Subject: [PATCH 12/13] not again --- assets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets b/assets index a7ba09b7650..0eafbf1247c 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit a7ba09b7650eab57b667b0905ca175884ad35239 +Subproject commit 0eafbf1247cdbe5228add28ec47c5e6aac9df8e2 From 16ce8ce434b7ca89a5e674d9d987f1be9b425c18 Mon Sep 17 00:00:00 2001 From: MightyTheArmiddilo Date: Wed, 8 Oct 2025 19:02:25 -0700 Subject: [PATCH 13/13] revert assets and maybe this'll work --- assets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets b/assets index 0eafbf1247c..1cbdede0fa5 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit 0eafbf1247cdbe5228add28ec47c5e6aac9df8e2 +Subproject commit 1cbdede0fa5fe1ca3ccc09b8f9fccb217993d43f