1
0
Fork 0
mirror of https://github.com/ninjamuffin99/Funkin.git synced 2025-11-28 23:35:54 +00:00

Merge branch 'rewrite/master' into ansi-trace

This commit is contained in:
Eric 2024-02-02 22:39:06 -05:00 committed by GitHub
commit 4d6ee03947
11 changed files with 212 additions and 221 deletions

View file

@ -3,9 +3,9 @@ description: "sets up haxe shit, using HMM!"
runs: runs:
using: "composite" using: "composite"
steps: steps:
- uses: funkincrew/ci-haxe@v2 - uses: funkincrew/ci-haxe@v3
with: with:
haxe-version: 4.3.1 haxe-version: 4.3.3
- name: Config haxelib - name: Config haxelib
run: | run: |
haxelib config haxelib config
@ -19,7 +19,7 @@ runs:
shell: bash shell: bash
- name: dependency install cache - name: dependency install cache
id: cache-hmm id: cache-hmm
uses: actions/cache@v3 uses: actions/cache@v4
with: with:
path: .haxelib path: .haxelib
key: ${{ runner.os }}-hmm-${{ hashFiles('**/hmm.json') }} key: ${{ runner.os }}-hmm-${{ hashFiles('**/hmm.json') }}

View file

@ -13,32 +13,32 @@ inputs:
runs: runs:
using: "composite" using: "composite"
steps: steps:
- name: Install butler Windows - name: Install butler Windows
if: runner.os == 'Windows' if: runner.os == 'Windows'
run: | run: |
curl -L -o butler.zip https://broth.itch.ovh/butler/windows-amd64/LATEST/archive/default curl -L -o butler.zip https://broth.itch.ovh/butler/windows-amd64/LATEST/archive/default
7z x butler.zip 7z x butler.zip
./butler -v ./butler -v
shell: bash shell: bash
- name: Install butler Mac - name: Install butler Mac
if: runner.os == 'macOS' if: runner.os == 'macOS'
run: | run: |
curl -L -o butler.zip https://broth.itch.ovh/butler/darwin-amd64/LATEST/archive/default curl -L -o butler.zip https://broth.itch.ovh/butler/darwin-amd64/LATEST/archive/default
unzip butler.zip unzip butler.zip
./butler -V ./butler -V
shell: bash shell: bash
- name: Install butler Linux - name: Install butler Linux
if: runner.os == 'Linux' if: runner.os == 'Linux'
run: | run: |
curl -L -o butler.zip https://broth.itch.ovh/butler/linux-amd64/LATEST/archive/default curl -L -o butler.zip https://broth.itch.ovh/butler/linux-amd64/LATEST/archive/default
unzip butler.zip unzip butler.zip
chmod +x butler chmod +x butler
./butler -V ./butler -V
shell: bash shell: bash
- name: Upload game to itch.io - name: Upload game to itch.io
env: env:
BUTLER_API_KEY: ${{inputs.butler-key}} BUTLER_API_KEY: ${{inputs.butler-key}}
run: | run: |
./butler login ./butler login
./butler push ${{inputs.build-dir}} ninja-muffin24/funkin-secret:${{inputs.target}}-${GITHUB_REF_NAME} ./butler push ${{inputs.build-dir}} ninja-muffin24/funkin-secret:${{inputs.target}}-${GITHUB_REF_NAME}
shell: bash shell: bash

View file

@ -4,56 +4,14 @@ on:
push: push:
jobs: jobs:
check_date:
runs-on: [self-hosted, linux]
container: ubuntu:latest
name: Check latest commit
outputs:
should_run: ${{ steps.should_run.outputs.should_run }}
steps:
- name: ensure git cli is installed
run: apt update && apt install sudo git -y
- name: get token from gh app
uses: actions/create-github-app-token@v1
id: app_token
with:
app-id: ${{ vars.APP_ID }}
private-key: ${{ secrets.APP_PEM }}
owner: ${{ github.repository_owner }}
- name: checkout repo
uses: funkincrew/ci-checkout@v5
with:
submodules: 'recursive'
token: ${{ steps.app_token.outputs.token }}
- name: check whether submodules exist
run: |
git config --global --add safe.directory $GITHUB_WORKSPACE
# debug output
echo gh=${{ github.sha }}
echo head=$(git rev-parse HEAD)
echo art=$(git -C art rev-parse HEAD)
echo assets=$(git -C assets rev-parse HEAD)
# checks if HEAD commit hash in submodules is diff from current repo, and therefore exists
test $(git rev-parse HEAD) != $(git -C art rev-parse HEAD)
test $(git rev-parse HEAD) != $(git -C assets rev-parse HEAD)
- id: should_run
continue-on-error: true
name: check latest commit is less than a day
if: ${{ github.event_name == 'schedule' }}
run: test -z $(git rev-list --after="24 hours" ${{ github.sha }}) && echo "::set-output name=should_run::false"
create-nightly-html5: create-nightly-html5:
needs: check_date
if: ${{ needs.check_date.outputs.should_run != 'false'}}
runs-on: [self-hosted, linux] runs-on: [self-hosted, linux]
container: ubuntu:latest container: ubuntu:23.10
steps: steps:
- name: prepare container - name: prepare container
run: | run: |
apt update apt update
apt install sudo git curl unzip -y apt install sudo git curl unzip -y
echo $GITHUB_WORKSPACE
git config --global --add safe.directory $GITHUB_WORKSPACE git config --global --add safe.directory $GITHUB_WORKSPACE
- name: get token from gh app - name: get token from gh app
uses: actions/create-github-app-token@v1 uses: actions/create-github-app-token@v1
@ -63,12 +21,12 @@ jobs:
private-key: ${{ secrets.APP_PEM }} private-key: ${{ secrets.APP_PEM }}
owner: ${{ github.repository_owner }} owner: ${{ github.repository_owner }}
- name: checkout repo - name: checkout repo
uses: funkincrew/ci-checkout@v5 uses: funkincrew/ci-checkout@v6
with: with:
submodules: 'recursive' submodules: 'recursive'
token: ${{ steps.app_token.outputs.token }} token: ${{ steps.app_token.outputs.token }}
- uses: ./.github/actions/setup-haxeshit - uses: ./.github/actions/setup-haxeshit
- name: game build dependencies - name: gather game dependencies
run: | run: |
sudo apt-get install -y libx11-dev xorg-dev libgl-dev libxi-dev libxext-dev libasound2-dev libxinerama-dev libxrandr-dev libgl1-mesa-dev sudo apt-get install -y libx11-dev xorg-dev libgl-dev libxi-dev libxext-dev libasound2-dev libxinerama-dev libxrandr-dev libgl1-mesa-dev
- name: build game - name: build game
@ -81,12 +39,7 @@ jobs:
build-dir: export/release/html5/bin build-dir: export/release/html5/bin
target: html5 target: html5
create-nightly-win: create-nightly-win:
needs: check_date
if: ${{ needs.check_date.outputs.should_run != 'false'}}
runs-on: windows-latest runs-on: windows-latest
permissions:
contents: write
actions: write
steps: steps:
- name: get token from gh app - name: get token from gh app
uses: actions/create-github-app-token@v1 uses: actions/create-github-app-token@v1
@ -96,7 +49,7 @@ jobs:
private-key: ${{ secrets.APP_PEM }} private-key: ${{ secrets.APP_PEM }}
owner: ${{ github.repository_owner }} owner: ${{ github.repository_owner }}
- name: checkout repo - name: checkout repo
uses: funkincrew/ci-checkout@v5 uses: funkincrew/ci-checkout@v6
with: with:
submodules: 'recursive' submodules: 'recursive'
token: ${{ steps.app_token.outputs.token }} token: ${{ steps.app_token.outputs.token }}
@ -106,14 +59,14 @@ jobs:
mkdir -p ${{ runner.temp }}\hxcpp_cache mkdir -p ${{ runner.temp }}\hxcpp_cache
- name: Restore build cache - name: Restore build cache
id: cache-build-win id: cache-build-win
uses: actions/cache@v3 uses: actions/cache@v4
with: with:
path: | path: |
.haxelib .haxelib
export export
${{ runner.temp }}\hxcpp_cache ${{ runner.temp }}\hxcpp_cache
key: ${{ runner.os }}-build-win-${{ github.ref_name }}-${{ hashFiles('**/hmm.json') }} key: ${{ runner.os }}-build-win-${{ github.ref_name }}-${{ hashFiles('**/hmm.json') }}
- name: Build game - name: build game
run: | run: |
haxelib run lime build windows -release -DNO_REDIRECT_ASSETS_FOLDER haxelib run lime build windows -release -DNO_REDIRECT_ASSETS_FOLDER
dir dir
@ -125,8 +78,6 @@ jobs:
build-dir: export/release/windows/bin build-dir: export/release/windows/bin
target: win target: win
create-nightly-mac: create-nightly-mac:
needs: check_date
if: ${{ needs.check_date.outputs.should_run != 'false'}}
runs-on: [self-hosted, macos] runs-on: [self-hosted, macos]
steps: steps:
- name: prepare container - name: prepare container
@ -140,7 +91,7 @@ jobs:
private-key: ${{ secrets.APP_PEM }} private-key: ${{ secrets.APP_PEM }}
owner: ${{ github.repository_owner }} owner: ${{ github.repository_owner }}
- name: checkout repo - name: checkout repo
uses: funkincrew/ci-checkout@v5 uses: funkincrew/ci-checkout@v6
with: with:
submodules: 'recursive' submodules: 'recursive'
token: ${{ steps.app_token.outputs.token }} token: ${{ steps.app_token.outputs.token }}
@ -148,9 +99,9 @@ jobs:
- name: Make HXCPP cache dir - name: Make HXCPP cache dir
run: | run: |
mkdir -p ${{ runner.temp }}/hxcpp_cache mkdir -p ${{ runner.temp }}/hxcpp_cache
- name: Restore build cache - name: restore build cache
id: cache-build-win id: cache-build-win
uses: actions/cache@v3 uses: actions/cache@v4
with: with:
path: | path: |
.haxelib .haxelib
@ -168,20 +119,39 @@ jobs:
butler-key: ${{ secrets.BUTLER_API_KEY}} butler-key: ${{ secrets.BUTLER_API_KEY}}
build-dir: export/release/macos/bin build-dir: export/release/macos/bin
target: macos target: macos
# test-unit-win: # test-unit-win:
# needs: create-nightly-win # needs: create-nightly-win
# runs-on: windows-latest # runs-on: windows-latest
# permissions:
# contents: write
# actions: write
# steps: # steps:
# - uses: funkincrew/ci-checkout@v5 # - name: get token from gh app
# uses: actions/create-github-app-token@v1
# id: app_token
# with: # with:
# submodules: 'recursive' # app-id: ${{ vars.APP_ID }}
# fetch-depth: 0 # private-key: ${{ secrets.APP_PEM }}
# token: ${{ secrets.GH_RO_PAT }} # owner: ${{ github.repository_owner }}
# - name: checkout repo
# uses: funkincrew/ci-checkout@v6
# with:
# submodules: 'recursive'
# token: ${{ steps.app_token.outputs.token }}
# - name: Make HXCPP cache dir
# run: |
# mkdir -p ${{ runner.temp }}\hxcpp_cache
# - name: Restore build cache
# id: cache-build-win
# uses: actions/cache@v4
# with:
# path: |
# .haxelib
# export
# ${{ runner.temp }}\hxcpp_cache
# key: ${{ runner.os }}-test-win-${{ github.ref_name }}-${{ hashFiles('**/hmm.json') }}
# - uses: ./.github/actions/setup-haxeshit # - uses: ./.github/actions/setup-haxeshit
# - name: Run unit tests # - name: Run unit tests
# run: | # run: |
# cd ./tests/unit/ # cd ./tests/unit/
# ./start-win-native.bat # ./start-win-native.bat
# env:
# HXCPP_COMPILE_CACHE: "${{ runner.temp }}\\hxcpp_cache"

2
assets

@ -1 +1 @@
Subproject commit 7e19c4cfa7db57178f03ed4a58a9fd4d2b93dea7 Subproject commit b2f8b6a780316959d0a79adc6dbf61f9e4ca675f

View file

@ -54,14 +54,14 @@
"name": "haxeui-core", "name": "haxeui-core",
"type": "git", "type": "git",
"dir": null, "dir": null,
"ref": "bb904f8b4b205755a310c23ff25219f9dcd62711", "ref": "5b2d5b8e7e470cf637953e1369c80a1f42016a75",
"url": "https://github.com/haxeui/haxeui-core" "url": "https://github.com/haxeui/haxeui-core"
}, },
{ {
"name": "haxeui-flixel", "name": "haxeui-flixel",
"type": "git", "type": "git",
"dir": null, "dir": null,
"ref": "1ec470c297afd7758a90dc9399aa1e3a4ea6ca0b", "ref": "e9f880522e27134b29df4067f82df7d7e5237b70",
"url": "https://github.com/haxeui/haxeui-flixel" "url": "https://github.com/haxeui/haxeui-flixel"
}, },
{ {

View file

@ -8,8 +8,7 @@ class PolygonVisGroup extends FlxTypedGroup<PolygonSpectogram>
{ {
public var playerVis:PolygonSpectogram; public var playerVis:PolygonSpectogram;
public var opponentVis:PolygonSpectogram; public var opponentVis:PolygonSpectogram;
public var instVis:PolygonSpectogram;
var instVis:PolygonSpectogram;
public function new() public function new()
{ {
@ -51,6 +50,43 @@ class PolygonVisGroup extends FlxTypedGroup<PolygonSpectogram>
instVis = vis; instVis = vis;
} }
public function clearPlayerVis():Void
{
if (playerVis != null)
{
remove(playerVis);
playerVis.destroy();
playerVis = null;
}
}
public function clearOpponentVis():Void
{
if (opponentVis != null)
{
remove(opponentVis);
opponentVis.destroy();
opponentVis = null;
}
}
public function clearInstVis():Void
{
if (instVis != null)
{
remove(instVis);
instVis.destroy();
instVis = null;
}
}
public function clearAllVis():Void
{
clearPlayerVis();
clearOpponentVis();
clearInstVis();
}
/** /**
* Overrides the add function to add a visualizer to the group. * Overrides the add function to add a visualizer to the group.
* @param vis The visualizer to add. * @param vis The visualizer to add.

View file

@ -235,6 +235,7 @@ class Song implements IPlayStateScriptedClass implements IRegistryEntry<SongMeta
difficulty.timeChanges = metadata.timeChanges; difficulty.timeChanges = metadata.timeChanges;
difficulty.looped = metadata.looped; difficulty.looped = metadata.looped;
difficulty.generatedBy = metadata.generatedBy; difficulty.generatedBy = metadata.generatedBy;
difficulty.offsets = metadata?.offsets ?? new SongOffsets();
difficulty.stage = metadata.playData.stage; difficulty.stage = metadata.playData.stage;
difficulty.noteStyle = metadata.playData.noteStyle; difficulty.noteStyle = metadata.playData.noteStyle;

View file

@ -108,10 +108,7 @@ abstract Save(RawSaveData)
metronomeVolume: 1.0, metronomeVolume: 1.0,
hitsoundsEnabledPlayer: true, hitsoundsEnabledPlayer: true,
hitsoundsEnabledOpponent: true, hitsoundsEnabledOpponent: true,
themeMusic: true, themeMusic: true
instVolume: 1.0,
voicesVolume: 1.0,
playbackSpeed: 1.0,
}, },
}; };
} }
@ -365,40 +362,6 @@ abstract Save(RawSaveData)
return this.optionsChartEditor.themeMusic; return this.optionsChartEditor.themeMusic;
} }
public var chartEditorInstVolume(get, set):Float;
function get_chartEditorInstVolume():Float
{
if (this.optionsChartEditor.instVolume == null) this.optionsChartEditor.instVolume = 1.0;
return this.optionsChartEditor.instVolume;
}
function set_chartEditorInstVolume(value:Float):Float
{
// Set and apply.
this.optionsChartEditor.instVolume = value;
flush();
return this.optionsChartEditor.instVolume;
}
public var chartEditorVoicesVolume(get, set):Float;
function get_chartEditorVoicesVolume():Float
{
if (this.optionsChartEditor.voicesVolume == null) this.optionsChartEditor.voicesVolume = 1.0;
return this.optionsChartEditor.voicesVolume;
}
function set_chartEditorVoicesVolume(value:Float):Float
{
// Set and apply.
this.optionsChartEditor.voicesVolume = value;
flush();
return this.optionsChartEditor.voicesVolume;
}
public var chartEditorPlaybackSpeed(get, set):Float; public var chartEditorPlaybackSpeed(get, set):Float;
function get_chartEditorPlaybackSpeed():Float function get_chartEditorPlaybackSpeed():Float

View file

@ -106,7 +106,6 @@ import haxe.ui.components.Label;
import haxe.ui.components.Button; import haxe.ui.components.Button;
import haxe.ui.components.NumberStepper; import haxe.ui.components.NumberStepper;
import haxe.ui.components.Slider; import haxe.ui.components.Slider;
import haxe.ui.components.VerticalSlider;
import haxe.ui.components.TextField; import haxe.ui.components.TextField;
import haxe.ui.containers.dialogs.CollapsibleDialog; import haxe.ui.containers.dialogs.CollapsibleDialog;
import haxe.ui.containers.Frame; import haxe.ui.containers.Frame;
@ -723,34 +722,6 @@ class ChartEditorState extends UIState // UIState derives from MusicBeatState
return hitsoundsEnabledPlayer || hitsoundsEnabledOpponent; return hitsoundsEnabledPlayer || hitsoundsEnabledOpponent;
} }
/**
* Sound multiplier for vocals and hitsounds on the player's side.
*/
var soundMultiplierPlayer(default, set):Float = 1.0;
function set_soundMultiplierPlayer(value:Float):Float
{
soundMultiplierPlayer = value;
var vocalTargetVolume:Float = (menubarItemVolumeVocals.value ?? 100.0) / 100.0;
if (audioVocalTrackGroup != null) audioVocalTrackGroup.playerVolume = vocalTargetVolume * soundMultiplierPlayer;
return soundMultiplierPlayer;
}
/**
* Sound multiplier for vocals and hitsounds on the opponent's side.
*/
var soundMultiplierOpponent(default, set):Float = 1.0;
function set_soundMultiplierOpponent(value:Float):Float
{
soundMultiplierOpponent = value;
var vocalTargetVolume:Float = (menubarItemVolumeVocals.value ?? 100.0) / 100.0;
if (audioVocalTrackGroup != null) audioVocalTrackGroup.opponentVolume = vocalTargetVolume * soundMultiplierOpponent;
return soundMultiplierOpponent;
}
// Auto-save // Auto-save
/** /**
@ -1395,6 +1366,46 @@ class ChartEditorState extends UIState // UIState derives from MusicBeatState
return currentSongMetadata.artist = value; return currentSongMetadata.artist = value;
} }
/**
* Convenience property to get the player charId for the current variation.
*/
var currentPlayerChar(get, set):String;
function get_currentPlayerChar():String
{
if (currentSongMetadata.playData.characters.player == null)
{
// Initialize to the default value if not set.
currentSongMetadata.playData.characters.player = Constants.DEFAULT_CHARACTER;
}
return currentSongMetadata.playData.characters.player;
}
function set_currentPlayerChar(value:String):String
{
return currentSongMetadata.playData.characters.player = value;
}
/**
* Convenience property to get the opponent charId for the current variation.
*/
var currentOpponentChar(get, set):String;
function get_currentOpponentChar():String
{
if (currentSongMetadata.playData.characters.opponent == null)
{
// Initialize to the default value if not set.
currentSongMetadata.playData.characters.opponent = Constants.DEFAULT_CHARACTER;
}
return currentSongMetadata.playData.characters.opponent;
}
function set_currentOpponentChar(value:String):String
{
return currentSongMetadata.playData.characters.opponent = value;
}
/** /**
* Convenience property to get the song offset data for the current variation. * Convenience property to get the song offset data for the current variation.
*/ */
@ -1430,6 +1441,23 @@ class ChartEditorState extends UIState // UIState derives from MusicBeatState
return value; return value;
} }
var currentVocalOffset(get, set):Float;
function get_currentVocalOffset():Float
{
// Currently there's only one vocal offset, so we just grab the player's offset since both should be the same.
// Should probably make it so we can set offsets for player + opponent individually, though.
return currentSongOffsets.getVocalOffset(currentPlayerChar);
}
function set_currentVocalOffset(value:Float):Float
{
// Currently there's only one vocal offset, so we just apply it to both characters.
currentSongOffsets.setVocalOffset(currentPlayerChar, value);
currentSongOffsets.setVocalOffset(currentOpponentChar, value);
return value;
}
/** /**
* The variation ID for the difficulty which is currently being edited. * The variation ID for the difficulty which is currently being edited.
*/ */
@ -1703,14 +1731,24 @@ class ChartEditorState extends UIState // UIState derives from MusicBeatState
var menubarItemVolumeInstrumental:Slider; var menubarItemVolumeInstrumental:Slider;
/** /**
* The `Audio -> Vocal Volume` label. * The `Audio -> Player Volume` label.
*/ */
var menubarLabelVolumeVocals:Label; var menubarLabelVolumeVocalsPlayer:Label;
/** /**
* The `Audio -> Vocal Volume` slider. * The `Audio -> Enemy Volume` label.
*/ */
var menubarItemVolumeVocals:Slider; var menubarLabelVolumeVocalsOpponent:Label;
/**
* The `Audio -> Player Volume` slider.
*/
var menubarItemVolumeVocalsPlayer:Slider;
/**
* The `Audio -> Enemy Volume` slider.
*/
var menubarItemVolumeVocalsOpponent:Slider;
/** /**
* The `Audio -> Playback Speed` label. * The `Audio -> Playback Speed` label.
@ -2601,37 +2639,6 @@ class ChartEditorState extends UIState // UIState derives from MusicBeatState
performCommand(new SetItemSelectionCommand([], currentSongChartEventData)); performCommand(new SetItemSelectionCommand([], currentSongChartEventData));
} }
} }
function setupSideSlider(x, y):VerticalSlider
{
var slider = new VerticalSlider();
slider.allowFocus = false;
slider.x = x;
slider.y = y;
slider.width = NOTE_SELECT_BUTTON_HEIGHT;
slider.height = GRID_SIZE * 4;
slider.pos = slider.max;
slider.tooltip = "Slide to set the volume of sounds on this side.";
slider.zIndex = 110;
slider.styleNames = "sideSlider";
add(slider);
return slider;
}
var sliderY = GRID_INITIAL_Y_POS + 34;
sliderVolumeOpponent = setupSideSlider(GRID_X_POS - 64, sliderY);
sliderVolumePlayer = setupSideSlider(buttonSelectEvent.x + buttonSelectEvent.width, sliderY);
sliderVolumePlayer.onChange = event -> {
var volume:Float = event.value.toFloat() / 100.0;
soundMultiplierPlayer = volume;
}
sliderVolumeOpponent.onChange = event -> {
var volume:Float = event.value.toFloat() / 100.0;
soundMultiplierOpponent = volume;
}
} }
/** /**
@ -2870,18 +2877,20 @@ class ChartEditorState extends UIState // UIState derives from MusicBeatState
menubarLabelVolumeInstrumental.text = 'Instrumental - ${Std.int(event.value)}%'; menubarLabelVolumeInstrumental.text = 'Instrumental - ${Std.int(event.value)}%';
}; };
menubarItemVolumeVocals.onChange = event -> { menubarItemVolumeVocalsPlayer.onChange = event -> {
var volume:Float = event.value.toFloat() / 100.0; var volume:Float = event.value.toFloat() / 100.0;
if (audioVocalTrackGroup != null) if (audioVocalTrackGroup != null) audioVocalTrackGroup.playerVolume = volume;
{ menubarLabelVolumeVocalsPlayer.text = 'Player - ${Std.int(event.value)}%';
audioVocalTrackGroup.playerVolume = volume * soundMultiplierPlayer; };
audioVocalTrackGroup.opponentVolume = volume * soundMultiplierOpponent;
} menubarItemVolumeVocalsOpponent.onChange = event -> {
menubarLabelVolumeVocals.text = 'Voices - ${Std.int(event.value)}%'; var volume:Float = event.value.toFloat() / 100.0;
} if (audioVocalTrackGroup != null) audioVocalTrackGroup.opponentVolume = volume;
menubarLabelVolumeVocalsOpponent.text = 'Enemy - ${Std.int(event.value)}%';
};
menubarItemPlaybackSpeed.onChange = event -> { menubarItemPlaybackSpeed.onChange = event -> {
var pitch:Float = (event.value * 2.0) / 100.0; var pitch:Float = (event.value.toFloat() * 2.0) / 100.0;
pitch = Math.floor(pitch / 0.25) * 0.25; // Round to nearest 0.25. pitch = Math.floor(pitch / 0.25) * 0.25; // Round to nearest 0.25.
#if FLX_PITCH #if FLX_PITCH
if (audioInstTrack != null) audioInstTrack.pitch = pitch; if (audioInstTrack != null) audioInstTrack.pitch = pitch;
@ -5734,7 +5743,8 @@ class ChartEditorState extends UIState // UIState derives from MusicBeatState
// Reapply the volume. // Reapply the volume.
var instTargetVolume:Float = menubarItemVolumeInstrumental.value ?? 1.0; var instTargetVolume:Float = menubarItemVolumeInstrumental.value ?? 1.0;
var vocalTargetVolume:Float = menubarItemVolumeVocals.value ?? 1.0; var vocalPlayerTargetVolume:Float = menubarItemVolumeVocalsPlayer.value ?? 1.0;
var vocalOpponentTargetVolume:Float = menubarItemVolumeVocalsOpponent.value ?? 1.0;
if (audioInstTrack != null) if (audioInstTrack != null)
{ {
@ -5743,8 +5753,8 @@ class ChartEditorState extends UIState // UIState derives from MusicBeatState
} }
if (audioVocalTrackGroup != null) if (audioVocalTrackGroup != null)
{ {
audioVocalTrackGroup.playerVolume = vocalTargetVolume * soundMultiplierPlayer; audioVocalTrackGroup.playerVolume = vocalPlayerTargetVolume;
audioVocalTrackGroup.opponentVolume = vocalTargetVolume * soundMultiplierOpponent; audioVocalTrackGroup.opponentVolume = vocalOpponentTargetVolume;
} }
} }
@ -5861,9 +5871,9 @@ class ChartEditorState extends UIState // UIState derives from MusicBeatState
switch (noteData.getStrumlineIndex()) switch (noteData.getStrumlineIndex())
{ {
case 0: // Player case 0: // Player
if (hitsoundsEnabledPlayer) this.playSound(Paths.sound('chartingSounds/hitNotePlayer'), hitsoundVolume * soundMultiplierPlayer); if (hitsoundsEnabledPlayer) this.playSound(Paths.sound('chartingSounds/hitNotePlayer'), hitsoundVolume);
case 1: // Opponent case 1: // Opponent
if (hitsoundsEnabledOpponent) this.playSound(Paths.sound('chartingSounds/hitNoteOpponent'), hitsoundVolume * soundMultiplierOpponent); if (hitsoundsEnabledOpponent) this.playSound(Paths.sound('chartingSounds/hitNoteOpponent'), hitsoundVolume);
} }
} }
} }

View file

@ -190,7 +190,7 @@ class ChartEditorAudioHandler
state.audioVisGroup.playerVis.detail = 1; state.audioVisGroup.playerVis.detail = 1;
state.audioVisGroup.playerVis.y = Math.max(state.gridTiledSprite?.y ?? 0.0, ChartEditorState.GRID_INITIAL_Y_POS - ChartEditorState.GRID_TOP_PAD); state.audioVisGroup.playerVis.y = Math.max(state.gridTiledSprite?.y ?? 0.0, ChartEditorState.GRID_INITIAL_Y_POS - ChartEditorState.GRID_TOP_PAD);
state.audioVocalTrackGroup.playerVoicesOffset = state.currentSongOffsets.getVocalOffset(charId); state.audioVocalTrackGroup.playerVoicesOffset = state.currentVocalOffset;
return true; return true;
case DAD: case DAD:
state.audioVocalTrackGroup.addOpponentVoice(vocalTrack); state.audioVocalTrackGroup.addOpponentVoice(vocalTrack);
@ -202,7 +202,7 @@ class ChartEditorAudioHandler
state.audioVisGroup.opponentVis.detail = 1; state.audioVisGroup.opponentVis.detail = 1;
state.audioVisGroup.opponentVis.y = Math.max(state.gridTiledSprite?.y ?? 0.0, ChartEditorState.GRID_INITIAL_Y_POS - ChartEditorState.GRID_TOP_PAD); state.audioVisGroup.opponentVis.y = Math.max(state.gridTiledSprite?.y ?? 0.0, ChartEditorState.GRID_INITIAL_Y_POS - ChartEditorState.GRID_TOP_PAD);
state.audioVocalTrackGroup.opponentVoicesOffset = state.currentSongOffsets.getVocalOffset(charId); state.audioVocalTrackGroup.opponentVoicesOffset = state.currentVocalOffset;
return true; return true;
case OTHER: case OTHER:
@ -223,6 +223,10 @@ class ChartEditorAudioHandler
{ {
state.audioVocalTrackGroup.clear(); state.audioVocalTrackGroup.clear();
} }
if (state.audioVisGroup != null)
{
state.audioVisGroup.clearAllVis();
}
} }
/** /**

View file

@ -150,7 +150,12 @@ class ChartEditorMetadataToolbox extends ChartEditorBaseToolbox
inputOffsetVocal.onChange = function(event:UIEvent) { inputOffsetVocal.onChange = function(event:UIEvent) {
if (event.value == null) return; if (event.value == null) return;
chartEditorState.currentSongMetadata.offsets.setVocalOffset(chartEditorState.currentSongMetadata.playData.characters.player, event.value); chartEditorState.currentVocalOffset = event.value;
if (chartEditorState.audioVocalTrackGroup != null)
{
chartEditorState.audioVocalTrackGroup.playerVoicesOffset = event.value;
chartEditorState.audioVocalTrackGroup.opponentVoicesOffset = event.value;
}
}; };
inputScrollSpeed.onChange = function(event:UIEvent) { inputScrollSpeed.onChange = function(event:UIEvent) {
var valid:Bool = event.target.value != null && event.target.value > 0; var valid:Bool = event.target.value != null && event.target.value > 0;
@ -191,6 +196,8 @@ class ChartEditorMetadataToolbox extends ChartEditorBaseToolbox
inputStage.value = chartEditorState.currentSongMetadata.playData.stage; inputStage.value = chartEditorState.currentSongMetadata.playData.stage;
inputNoteStyle.value = chartEditorState.currentSongMetadata.playData.noteStyle; inputNoteStyle.value = chartEditorState.currentSongMetadata.playData.noteStyle;
inputBPM.value = chartEditorState.currentSongMetadata.timeChanges[0].bpm; inputBPM.value = chartEditorState.currentSongMetadata.timeChanges[0].bpm;
inputOffsetInst.value = chartEditorState.currentSongMetadata.offsets.getInstrumentalOffset();
inputOffsetVocal.value = chartEditorState.currentSongMetadata.offsets.getVocalOffset(chartEditorState.currentSongMetadata.playData.characters.player);
inputScrollSpeed.value = chartEditorState.currentSongChartScrollSpeed; inputScrollSpeed.value = chartEditorState.currentSongChartScrollSpeed;
labelScrollSpeed.text = 'Scroll Speed: ${chartEditorState.currentSongChartScrollSpeed}x'; labelScrollSpeed.text = 'Scroll Speed: ${chartEditorState.currentSongChartScrollSpeed}x';
frameVariation.text = 'Variation: ${chartEditorState.selectedVariation.toTitleCase()}'; frameVariation.text = 'Variation: ${chartEditorState.selectedVariation.toTitleCase()}';