Merge branch 'rewrite/master' into feature/credits

This commit is contained in:
Cameron Taylor 2024-04-01 22:06:58 -04:00
commit 7fb4b47e2a
8 changed files with 80 additions and 14 deletions

View file

@ -3,6 +3,10 @@ on:
workflow_dispatch: workflow_dispatch:
push: push:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs: jobs:
create-nightly-html5: create-nightly-html5:
runs-on: [self-hosted, linux] runs-on: [self-hosted, linux]

View file

@ -0,0 +1,35 @@
name: cancel-merged-branches
on:
pull_request:
types:
- closed
jobs:
cancel_stuff:
if: github.event.pull_request.merged == true
runs-on: ubuntu-latest
permissions:
actions: write
steps:
- uses: actions/github-script@v7
id: cancel-runs
with:
result-encoding: string
retries: 3
script: |
let branch_workflows = await github.rest.actions.listWorkflowRuns({
owner: context.repo.owner,
repo: context.repo.repo,
workflow_id: "build-shit.yml",
status: "queued",
branch: "${{ github.event.pull_request.head.ref }}"
});
let runs = branch_workflows.data.workflow_runs;
runs.forEach((run) => {
github.rest.actions.cancelWorkflowRun({
owner: context.repo.owner,
repo: context.repo.repo,
run_id: run.id
});
});
console.log(runs);

View file

@ -402,10 +402,16 @@ class FunkinSound extends FlxSound implements ICloneable<FunkinSound>
return sound; return sound;
} }
@:nullSafety(Off)
public override function destroy():Void public override function destroy():Void
{ {
// trace('[FunkinSound] Destroying sound "${this._label}"'); // trace('[FunkinSound] Destroying sound "${this._label}"');
super.destroy(); super.destroy();
if (fadeTween != null)
{
fadeTween.cancel();
fadeTween = null;
}
FlxTween.cancelTweensOf(this); FlxTween.cancelTweensOf(this);
this._label = 'unknown'; this._label = 'unknown';
} }

View file

@ -159,10 +159,18 @@ class VoicesGroup extends SoundGroup
public override function destroy():Void public override function destroy():Void
{ {
playerVoices.destroy(); if (playerVoices != null)
playerVoices = null; {
opponentVoices.destroy(); playerVoices.destroy();
opponentVoices = null; playerVoices = null;
}
if (opponentVoices != null)
{
opponentVoices.destroy();
opponentVoices = null;
}
super.destroy(); super.destroy();
} }
} }

View file

@ -230,7 +230,7 @@ class PauseSubState extends MusicBeatSubState
*/ */
function startPauseMusic():Void function startPauseMusic():Void
{ {
var pauseMusicPath:String = Paths.music('breakfast$musicSuffix'); var pauseMusicPath:String = Paths.music('breakfast$musicSuffix/breakfast$musicSuffix');
pauseMusic = FunkinSound.load(pauseMusicPath, true, true); pauseMusic = FunkinSound.load(pauseMusicPath, true, true);
if (pauseMusic == null) if (pauseMusic == null)

View file

@ -2441,7 +2441,8 @@ class PlayState extends MusicBeatSubState
if (Highscore.tallies.combo != 0) if (Highscore.tallies.combo != 0)
{ {
// Break the combo. // Break the combo.
Highscore.tallies.combo = comboPopUps.displayCombo(0); if (Highscore.tallies.combo >= 10) comboPopUps.displayCombo(0);
Highscore.tallies.combo = 0;
} }
if (playSound) if (playSound)
@ -2568,32 +2569,38 @@ class PlayState extends MusicBeatSubState
*/ */
function popUpScore(daNote:NoteSprite, score:Int, daRating:String, healthChange:Float):Void function popUpScore(daNote:NoteSprite, score:Int, daRating:String, healthChange:Float):Void
{ {
vocals.playerVolume = 1;
if (daRating == 'miss') if (daRating == 'miss')
{ {
// If daRating is 'miss', that means we made a mistake and should not continue. // If daRating is 'miss', that means we made a mistake and should not continue.
trace('[WARNING] popUpScore judged a note as a miss!'); FlxG.log.warn('popUpScore judged a note as a miss!');
// TODO: Remove this. // TODO: Remove this.
comboPopUps.displayRating('miss'); comboPopUps.displayRating('miss');
return; return;
} }
vocals.playerVolume = 1;
var isComboBreak = false; var isComboBreak = false;
switch (daRating) switch (daRating)
{ {
case 'sick': case 'sick':
Highscore.tallies.sick += 1; Highscore.tallies.sick += 1;
Highscore.tallies.totalNotesHit++;
isComboBreak = Constants.JUDGEMENT_SICK_COMBO_BREAK; isComboBreak = Constants.JUDGEMENT_SICK_COMBO_BREAK;
case 'good': case 'good':
Highscore.tallies.good += 1; Highscore.tallies.good += 1;
Highscore.tallies.totalNotesHit++;
isComboBreak = Constants.JUDGEMENT_GOOD_COMBO_BREAK; isComboBreak = Constants.JUDGEMENT_GOOD_COMBO_BREAK;
case 'bad': case 'bad':
Highscore.tallies.bad += 1; Highscore.tallies.bad += 1;
Highscore.tallies.totalNotesHit++;
isComboBreak = Constants.JUDGEMENT_BAD_COMBO_BREAK; isComboBreak = Constants.JUDGEMENT_BAD_COMBO_BREAK;
case 'shit': case 'shit':
Highscore.tallies.shit += 1; Highscore.tallies.shit += 1;
Highscore.tallies.totalNotesHit++;
isComboBreak = Constants.JUDGEMENT_SHIT_COMBO_BREAK; isComboBreak = Constants.JUDGEMENT_SHIT_COMBO_BREAK;
default:
FlxG.log.error('Wuh? Buh? Guh? Note hit judgement was $daRating!');
} }
health += healthChange; health += healthChange;
@ -2601,18 +2608,18 @@ class PlayState extends MusicBeatSubState
if (isComboBreak) if (isComboBreak)
{ {
// Break the combo, but don't increment tallies.misses. // Break the combo, but don't increment tallies.misses.
Highscore.tallies.combo = comboPopUps.displayCombo(0); if (Highscore.tallies.combo >= 10) comboPopUps.displayCombo(0);
Highscore.tallies.combo = 0;
} }
else else
{ {
Highscore.tallies.combo++; Highscore.tallies.combo++;
Highscore.tallies.totalNotesHit++;
if (Highscore.tallies.combo > Highscore.tallies.maxCombo) Highscore.tallies.maxCombo = Highscore.tallies.combo; if (Highscore.tallies.combo > Highscore.tallies.maxCombo) Highscore.tallies.maxCombo = Highscore.tallies.combo;
} }
playerStrumline.hitNote(daNote, !isComboBreak); playerStrumline.hitNote(daNote, !isComboBreak);
if (daRating == "sick") if (daRating == 'sick')
{ {
playerStrumline.playNoteSplash(daNote.noteData.getDirection()); playerStrumline.playNoteSplash(daNote.noteData.getDirection());
} }

View file

@ -295,6 +295,11 @@ class Strumline extends FlxSpriteGroup
{ {
if (noteData.length == 0) return; if (noteData.length == 0) return;
// Ensure note data gets reset if the song happens to loop.
// NOTE: I had to remove this line because it was causing notes visible during the countdown to be placed multiple times.
// I don't remember what bug I was trying to fix by adding this.
// if (conductorInUse.currentStep == 0) nextNoteIndex = 0;
var songStart:Float = PlayState.instance?.startTimestamp ?? 0.0; var songStart:Float = PlayState.instance?.startTimestamp ?? 0.0;
var hitWindowStart:Float = Conductor.instance.songPosition - Constants.HIT_WINDOW_MS; var hitWindowStart:Float = Conductor.instance.songPosition - Constants.HIT_WINDOW_MS;
var renderWindowStart:Float = Conductor.instance.songPosition + RENDER_DISTANCE_MS; var renderWindowStart:Float = Conductor.instance.songPosition + RENDER_DISTANCE_MS;
@ -822,7 +827,7 @@ class Strumline extends FlxSpriteGroup
{ {
// The note sprite pool is full and all note splashes are active. // The note sprite pool is full and all note splashes are active.
// We have to create a new note. // We have to create a new note.
result = new SustainTrail(0, 100, noteStyle); result = new SustainTrail(0, 0, noteStyle);
this.holdNotes.add(result); this.holdNotes.add(result);
} }

View file

@ -210,7 +210,8 @@ class LoadingState extends MusicBeatState
} }
// Load and cache the song's charts. // Load and cache the song's charts.
if (params?.targetSong != null) // Don't do this if we already provided the music and charts.
if (params?.targetSong != null && !params.overrideMusic)
{ {
params.targetSong.cacheCharts(true); params.targetSong.cacheCharts(true);
} }