mirror of
https://github.com/FunkinCrew/Funkin.git
synced 2024-11-29 02:55:45 -05:00
Merge branch 'patch-1' into rewrite/master
This commit is contained in:
commit
6fd030cb30
4 changed files with 72 additions and 72 deletions
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
Friday Night Funkin' is a rhythm game. Built using HaxeFlixel for Ludum Dare 47.
|
Friday Night Funkin' is a rhythm game. Built using HaxeFlixel for Ludum Dare 47.
|
||||||
|
|
||||||
This game was made with love to Newgrounds and it's community. Extra love to Tom Fulp.
|
This game was made with love to Newgrounds and its community. Extra love to Tom Fulp.
|
||||||
|
|
||||||
- [Playable web demo on Newgrounds!](https://www.newgrounds.com/portal/view/770371)
|
- [Playable web demo on Newgrounds!](https://www.newgrounds.com/portal/view/770371)
|
||||||
- [Demo download builds for Windows, Mac, and Linux from Itch.io!](https://ninja-muffin24.itch.io/funkin)
|
- [Demo download builds for Windows, Mac, and Linux from Itch.io!](https://ninja-muffin24.itch.io/funkin)
|
||||||
|
|
|
@ -140,16 +140,36 @@ class HitNoteScriptEvent extends NoteScriptEvent
|
||||||
*/
|
*/
|
||||||
public var score:Int;
|
public var score:Int;
|
||||||
|
|
||||||
public function new(note:NoteSprite, healthChange:Float, score:Int, judgement:String, comboCount:Int = 0):Void
|
/**
|
||||||
|
* If the hit causes a combo break.
|
||||||
|
*/
|
||||||
|
public var isComboBreak:Bool = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The time difference when the player hit the note
|
||||||
|
*/
|
||||||
|
public var hitDiff:Float = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If the hit causes a notesplash
|
||||||
|
*/
|
||||||
|
public var doesNotesplash:Bool = false;
|
||||||
|
|
||||||
|
public function new(note:NoteSprite, healthChange:Float, score:Int, judgement:String, isComboBreak:Bool, comboCount:Int = 0, hitDiff:Float = 0,
|
||||||
|
doesNotesplash:Bool = false):Void
|
||||||
{
|
{
|
||||||
super(NOTE_HIT, note, healthChange, comboCount, true);
|
super(NOTE_HIT, note, healthChange, comboCount, true);
|
||||||
this.score = score;
|
this.score = score;
|
||||||
this.judgement = judgement;
|
this.judgement = judgement;
|
||||||
|
this.isComboBreak = isComboBreak;
|
||||||
|
this.doesNotesplash = doesNotesplash;
|
||||||
|
this.hitDiff = hitDiff;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override function toString():String
|
public override function toString():String
|
||||||
{
|
{
|
||||||
return 'HitNoteScriptEvent(note=' + note + ', comboCount=' + comboCount + ', judgement=' + judgement + ', score=' + score + ')';
|
return 'HitNoteScriptEvent(note=' + note + ', comboCount=' + comboCount + ', judgement=' + judgement + ', score=' + score + ', isComboBreak='
|
||||||
|
+ isComboBreak + ', hitDiff=' + hitDiff + ', doesNotesplash=' + doesNotesplash + ')';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2115,7 +2115,8 @@ class PlayState extends MusicBeatSubState
|
||||||
|
|
||||||
// Call an event to allow canceling the note hit.
|
// Call an event to allow canceling the note hit.
|
||||||
// NOTE: This is what handles the character animations!
|
// NOTE: This is what handles the character animations!
|
||||||
var event:NoteScriptEvent = new HitNoteScriptEvent(note, 0.0, 0, 'perfect', 0);
|
|
||||||
|
var event:NoteScriptEvent = new HitNoteScriptEvent(note, 0.0, 0, 'perfect', false, 0);
|
||||||
dispatchEvent(event);
|
dispatchEvent(event);
|
||||||
|
|
||||||
// Calling event.cancelEvent() skips all the other logic! Neat!
|
// Calling event.cancelEvent() skips all the other logic! Neat!
|
||||||
|
@ -2211,7 +2212,7 @@ class PlayState extends MusicBeatSubState
|
||||||
|
|
||||||
// Call an event to allow canceling the note hit.
|
// Call an event to allow canceling the note hit.
|
||||||
// NOTE: This is what handles the character animations!
|
// NOTE: This is what handles the character animations!
|
||||||
var event:NoteScriptEvent = new HitNoteScriptEvent(note, 0.0, 0, 'perfect', 0);
|
var event:NoteScriptEvent = new HitNoteScriptEvent(note, 0.0, 0, 'perfect', false, 0);
|
||||||
dispatchEvent(event);
|
dispatchEvent(event);
|
||||||
|
|
||||||
// Calling event.cancelEvent() skips all the other logic! Neat!
|
// Calling event.cancelEvent() skips all the other logic! Neat!
|
||||||
|
@ -2420,27 +2421,41 @@ class PlayState extends MusicBeatSubState
|
||||||
var daRating = Scoring.judgeNote(noteDiff, PBOT1);
|
var daRating = Scoring.judgeNote(noteDiff, PBOT1);
|
||||||
|
|
||||||
var healthChange = 0.0;
|
var healthChange = 0.0;
|
||||||
|
var isComboBreak = false;
|
||||||
switch (daRating)
|
switch (daRating)
|
||||||
{
|
{
|
||||||
case 'sick':
|
case 'sick':
|
||||||
healthChange = Constants.HEALTH_SICK_BONUS;
|
healthChange = Constants.HEALTH_SICK_BONUS;
|
||||||
|
isComboBreak = Constants.JUDGEMENT_SICK_COMBO_BREAK;
|
||||||
case 'good':
|
case 'good':
|
||||||
healthChange = Constants.HEALTH_GOOD_BONUS;
|
healthChange = Constants.HEALTH_GOOD_BONUS;
|
||||||
|
isComboBreak = Constants.JUDGEMENT_GOOD_COMBO_BREAK;
|
||||||
case 'bad':
|
case 'bad':
|
||||||
healthChange = Constants.HEALTH_BAD_BONUS;
|
healthChange = Constants.HEALTH_BAD_BONUS;
|
||||||
|
isComboBreak = Constants.JUDGEMENT_BAD_COMBO_BREAK;
|
||||||
case 'shit':
|
case 'shit':
|
||||||
|
isComboBreak = Constants.JUDGEMENT_SHIT_COMBO_BREAK;
|
||||||
healthChange = Constants.HEALTH_SHIT_BONUS;
|
healthChange = Constants.HEALTH_SHIT_BONUS;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Send the note hit event.
|
// Send the note hit event.
|
||||||
var event:HitNoteScriptEvent = new HitNoteScriptEvent(note, healthChange, score, daRating, Highscore.tallies.combo + 1);
|
var event:HitNoteScriptEvent = new HitNoteScriptEvent(note, healthChange, score, daRating, isComboBreak, Highscore.tallies.combo + 1, noteDiff,
|
||||||
|
daRating == 'sick');
|
||||||
dispatchEvent(event);
|
dispatchEvent(event);
|
||||||
|
|
||||||
// Calling event.cancelEvent() skips all the other logic! Neat!
|
// Calling event.cancelEvent() skips all the other logic! Neat!
|
||||||
if (event.eventCanceled) return;
|
if (event.eventCanceled) return;
|
||||||
|
|
||||||
|
Highscore.tallies.totalNotesHit++;
|
||||||
|
// Display the hit on the strums
|
||||||
|
playerStrumline.hitNote(note, !isComboBreak);
|
||||||
|
if (event.doesNotesplash) playerStrumline.playNoteSplash(note.noteData.getDirection());
|
||||||
|
if (note.isHoldNote && note.holdNoteSprite != null) playerStrumline.playNoteHoldCover(note.holdNoteSprite);
|
||||||
|
vocals.playerVolume = 1;
|
||||||
|
|
||||||
// Display the combo meter and add the calculation to the score.
|
// Display the combo meter and add the calculation to the score.
|
||||||
popUpScore(note, event.score, event.judgement, event.healthChange);
|
applyScore(event.score, event.judgement, event.healthChange, event.isComboBreak);
|
||||||
|
popUpScore(event.judgement);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2451,9 +2466,6 @@ class PlayState extends MusicBeatSubState
|
||||||
{
|
{
|
||||||
// If we are here, we already CALLED the onNoteMiss script hook!
|
// If we are here, we already CALLED the onNoteMiss script hook!
|
||||||
|
|
||||||
health += healthChange;
|
|
||||||
songScore -= 10;
|
|
||||||
|
|
||||||
if (!isPracticeMode)
|
if (!isPracticeMode)
|
||||||
{
|
{
|
||||||
// messy copy paste rn lol
|
// messy copy paste rn lol
|
||||||
|
@ -2493,14 +2505,9 @@ class PlayState extends MusicBeatSubState
|
||||||
}
|
}
|
||||||
vocals.playerVolume = 0;
|
vocals.playerVolume = 0;
|
||||||
|
|
||||||
Highscore.tallies.missed++;
|
if (Highscore.tallies.combo != 0) if (Highscore.tallies.combo >= 10) comboPopUps.displayCombo(0);
|
||||||
|
|
||||||
if (Highscore.tallies.combo != 0)
|
applyScore(-10, 'miss', healthChange, true);
|
||||||
{
|
|
||||||
// Break the combo.
|
|
||||||
if (Highscore.tallies.combo >= 10) comboPopUps.displayCombo(0);
|
|
||||||
Highscore.tallies.combo = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (playSound)
|
if (playSound)
|
||||||
{
|
{
|
||||||
|
@ -2588,20 +2595,12 @@ class PlayState extends MusicBeatSubState
|
||||||
// Redirect to the chart editor playing the current song.
|
// Redirect to the chart editor playing the current song.
|
||||||
if (controls.DEBUG_CHART)
|
if (controls.DEBUG_CHART)
|
||||||
{
|
{
|
||||||
if (isChartingMode)
|
disableKeys = true;
|
||||||
{
|
persistentUpdate = false;
|
||||||
if (FlxG.sound.music != null) FlxG.sound.music.pause(); // Don't reset song position!
|
FlxG.switchState(() -> new ChartEditorState(
|
||||||
this.close(); // This only works because PlayState is a substate!
|
{
|
||||||
}
|
targetSongId: currentSong.id,
|
||||||
else
|
}));
|
||||||
{
|
|
||||||
disableKeys = true;
|
|
||||||
persistentUpdate = false;
|
|
||||||
FlxG.switchState(() -> new ChartEditorState(
|
|
||||||
{
|
|
||||||
targetSongId: currentSong.id,
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#end
|
#end
|
||||||
|
|
||||||
|
@ -2632,46 +2631,24 @@ class PlayState extends MusicBeatSubState
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handles health, score, and rating popups when a note is hit.
|
* Handles applying health, score, and ratings.
|
||||||
*/
|
*/
|
||||||
function popUpScore(daNote:NoteSprite, score:Int, daRating:String, healthChange:Float):Void
|
function applyScore(score:Int, daRating:String, healthChange:Float, isComboBreak:Bool)
|
||||||
{
|
{
|
||||||
if (daRating == 'miss')
|
|
||||||
{
|
|
||||||
// If daRating is 'miss', that means we made a mistake and should not continue.
|
|
||||||
FlxG.log.warn('popUpScore judged a note as a miss!');
|
|
||||||
// TODO: Remove this.
|
|
||||||
// comboPopUps.displayRating('miss');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
vocals.playerVolume = 1;
|
|
||||||
|
|
||||||
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;
|
|
||||||
case 'good':
|
case 'good':
|
||||||
Highscore.tallies.good += 1;
|
Highscore.tallies.good += 1;
|
||||||
Highscore.tallies.totalNotesHit++;
|
|
||||||
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;
|
|
||||||
case 'shit':
|
case 'shit':
|
||||||
Highscore.tallies.shit += 1;
|
Highscore.tallies.shit += 1;
|
||||||
Highscore.tallies.totalNotesHit++;
|
case 'miss':
|
||||||
isComboBreak = Constants.JUDGEMENT_SHIT_COMBO_BREAK;
|
Highscore.tallies.missed += 1;
|
||||||
default:
|
|
||||||
FlxG.log.error('Wuh? Buh? Guh? Note hit judgement was $daRating!');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
health += healthChange;
|
health += healthChange;
|
||||||
|
|
||||||
if (isComboBreak)
|
if (isComboBreak)
|
||||||
{
|
{
|
||||||
// Break the combo, but don't increment tallies.misses.
|
// Break the combo, but don't increment tallies.misses.
|
||||||
|
@ -2683,15 +2660,23 @@ class PlayState extends MusicBeatSubState
|
||||||
Highscore.tallies.combo++;
|
Highscore.tallies.combo++;
|
||||||
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);
|
|
||||||
|
|
||||||
if (daRating == 'sick')
|
|
||||||
{
|
|
||||||
playerStrumline.playNoteSplash(daNote.noteData.getDirection());
|
|
||||||
}
|
|
||||||
|
|
||||||
songScore += score;
|
songScore += score;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles rating popups when a note is hit.
|
||||||
|
*/
|
||||||
|
function popUpScore(daRating:String, ?combo:Int):Void
|
||||||
|
{
|
||||||
|
if (daRating == 'miss')
|
||||||
|
{
|
||||||
|
// If daRating is 'miss', that means we made a mistake and should not continue.
|
||||||
|
FlxG.log.warn('popUpScore judged a note as a miss!');
|
||||||
|
// TODO: Remove this.
|
||||||
|
// comboPopUps.displayRating('miss');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (combo == null) combo = Highscore.tallies.combo;
|
||||||
|
|
||||||
if (!isPracticeMode)
|
if (!isPracticeMode)
|
||||||
{
|
{
|
||||||
|
@ -2731,12 +2716,7 @@ class PlayState extends MusicBeatSubState
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
comboPopUps.displayRating(daRating);
|
comboPopUps.displayRating(daRating);
|
||||||
if (Highscore.tallies.combo >= 10 || Highscore.tallies.combo == 0) comboPopUps.displayCombo(Highscore.tallies.combo);
|
if (combo >= 10 || combo == 0) comboPopUps.displayCombo(combo);
|
||||||
|
|
||||||
if (daNote.isHoldNote && daNote.holdNoteSprite != null)
|
|
||||||
{
|
|
||||||
playerStrumline.playNoteHoldCover(daNote.holdNoteSprite);
|
|
||||||
}
|
|
||||||
|
|
||||||
vocals.playerVolume = 1;
|
vocals.playerVolume = 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -6304,7 +6304,7 @@ class ChartEditorState extends UIState // UIState derives from MusicBeatState
|
||||||
var tempNote:NoteSprite = new NoteSprite(NoteStyleRegistry.instance.fetchDefault());
|
var tempNote:NoteSprite = new NoteSprite(NoteStyleRegistry.instance.fetchDefault());
|
||||||
tempNote.noteData = noteData;
|
tempNote.noteData = noteData;
|
||||||
tempNote.scrollFactor.set(0, 0);
|
tempNote.scrollFactor.set(0, 0);
|
||||||
var event:NoteScriptEvent = new HitNoteScriptEvent(tempNote, 0.0, 0, 'perfect', 0);
|
var event:NoteScriptEvent = new HitNoteScriptEvent(tempNote, 0.0, 0, 'perfect', false, 0);
|
||||||
dispatchEvent(event);
|
dispatchEvent(event);
|
||||||
|
|
||||||
// Calling event.cancelEvent() skips all the other logic! Neat!
|
// Calling event.cancelEvent() skips all the other logic! Neat!
|
||||||
|
|
Loading…
Reference in a new issue