diff --git a/source/funkin/backend/scripting/events/NoteMissEvent.hx b/source/funkin/backend/scripting/events/NoteMissEvent.hx new file mode 100644 index 00000000..1b7d0901 --- /dev/null +++ b/source/funkin/backend/scripting/events/NoteMissEvent.hx @@ -0,0 +1,138 @@ +package funkin.backend.scripting.events; + +import funkin.game.Note; +import funkin.game.Character; + +final class NoteMissEvent extends CancellableEvent { + @:dox(hide) public var animCancelled:Bool = false; + @:dox(hide) public var deleteNote:Bool = true; + @:dox(hide) public var stunned:Bool = true; + @:dox(hide) public var resetCombo:Bool = true; + @:dox(hide) public var playMissSound:Bool = true; + + /** + * Note that has been missed + */ + public var note:Note; + public var score:Int; + public var misses:Int; + public var muteVocals:Bool; + /** + * The amount of health that'll be gained from missing that note. If called from `onPlayerMiss`, the value will be negative. + */ + public var healthGain:Float; + public var missSound:String; + public var missVolume:Float; + + public var ghostMiss:Bool; + public var gfSad:Bool; + public var gfSadAnim:String; + public var forceGfAnim:Bool; + /** + * Whenever the animation should be forced to play. + */ + public var forceAnim:Bool; + /** + * Suffix of the animation. "miss" for miss notes, "-alt" for alt notes, "" for normal ones. + */ + public var animSuffix:String; + + /** + * Character that pressed the note. + */ + public var character(get, set):Character; + /** + * Characters that pressed the note. + */ + public var characters:Array; + /** + * Whenever the Character is a player + */ + public var playerID:Int; + /** + * Note Type name (null if default note) + */ + public var noteType:String; + /** + * Direction of the press (0 = Left, 1 = Down, 2 = Up, 3 = Right) + */ + public var direction:Int; + /** + * Accuracy gained from pressing this note. From 0 to 1. null means no accuracy is gained. + */ + public var accuracy:Null; + + /** + * Prevents the miss sound from played. + */ + public function preventMissSound() { + playMissSound = false; + } + + @:dox(hide) + public function cancelMissSound() {preventMissSound();} + + /** + * Prevents the combo from being reset. + */ + public function preventResetCombo() { + resetCombo = false; + } + + @:dox(hide) + public function cancelResetCombo() {preventResetCombo();} + + /** + * Prevents the default sing animation from being played. + */ + public function preventStunned() { + stunned = false; + } + + @:dox(hide) + public function cancelStunned() {preventStunned();} + + /** + * Prevents the default sing animation from being played. + */ + public function preventAnim() { + animCancelled = true; + } + + @:dox(hide) + public function cancelAnim() {preventAnim();} + + /** + * Prevents the note from being deleted. + */ + public function preventDeletion() { + deleteNote = false; + } + @:dox(hide) + public function cancelDeletion() {preventDeletion();} + + /** + * Prevents the vocals volume from being set to 1 after pressing the note. + */ + public function preventVocalsUnmute() { + muteVocals = true; + } + @:dox(hide) + public function cancelVocalsUnmute() {preventVocalsUnmute();} + + /** + * Prevents the vocals volume from being muted in case its a parameter of `onPlayerMiss` + */ + public function preventVocalsMute() { + muteVocals = false; + } + @:dox(hide) + public function cancelVocalsMute() {preventVocalsMute();} + + private inline function get_character() + return characters[0]; + private function set_character(char:Character) { + characters = [char]; + return char; + } +} diff --git a/source/funkin/backend/system/macros/ScriptsMacro.hx b/source/funkin/backend/system/macros/ScriptsMacro.hx index 635939e7..ff445e8e 100644 --- a/source/funkin/backend/system/macros/ScriptsMacro.hx +++ b/source/funkin/backend/system/macros/ScriptsMacro.hx @@ -22,7 +22,7 @@ class ScriptsMacro { // OTHER LIBRARIES & STUFF "away3d", "flx3d", #if sys "sys", #end "openfl.net", "funkin.backend.system.net", - "hxcodec.flixel", "hxcodec.openfl", "hxcodec.lime", + #if VIDEO_CUTSCENES "hxcodec.flixel", "hxcodec.openfl", "hxcodec.lime", #end // BASE HAXE "DateTools", "EReg", "Lambda", "StringBuf", "haxe.crypto", "haxe.display", "haxe.exceptions", "haxe.extern", "scripting" ]) diff --git a/source/funkin/game/PlayState.hx b/source/funkin/game/PlayState.hx index 80ecc19e..3762e077 100644 --- a/source/funkin/game/PlayState.hx +++ b/source/funkin/game/PlayState.hx @@ -1371,21 +1371,22 @@ class PlayState extends MusicBeatState var directionID:Null = note == null ? direction : note.strumID; if (playerID == null || directionID == null || playerID == -1) return; - var event:NoteHitEvent = scripts.event("onPlayerMiss", EventManager.get(NoteHitEvent).recycle(true, false, false, note, strumLines.members[playerID].characters, true, note != null ? note.noteType : null, "", "", "", directionID, -10, 0, note != null ? -0.0475 : -0.04, "shit")); + var event:NoteMissEvent = scripts.event("onPlayerMiss", EventManager.get(NoteMissEvent).recycle(note, -10, 1, muteVocalsOnMiss, note != null ? -0.0475 : -0.04, Paths.soundRandom('missnote', 1, 3), FlxG.random.float(0.1, 0.2), note == null, combo > 5, "sad", true, true, "miss", strumLines.members[playerID].characters, playerID, note != null ? note.noteType : null, directionID, 0)); strumLine.onMiss.dispatch(event); if (event.cancelled) return; if (strumLine != null) strumLine.addHealth(event.healthGain); - if (gf != null && combo > 5 && gf.hasAnimation('sad')) - gf.playAnim('sad', event.forceAnim, MISS); - combo = 0; + if (gf != null && event.gfSad && gf.hasAnimation(event.gfSadAnim)) + gf.playAnim(event.gfSadAnim, event.forceGfAnim, MISS); - songScore -= 10; - misses++; + if (event.resetCombo) combo = 0; - FlxG.sound.play(Paths.soundRandom('missnote', 1, 3), FlxG.random.float(0.1, 0.2)); + songScore += event.score; + misses += event.misses; - if (muteVocalsOnMiss) vocals.volume = 0; + if (event.playMissSound) FlxG.sound.play(event.missSound, event.missVolume); + + if (event.muteVocals) vocals.volume = 0; if (event.accuracy != null) { accuracyPressedNotes++; @@ -1394,16 +1395,17 @@ class PlayState extends MusicBeatState updateRating(); } - for(char in event.characters) { - if (char == null) continue; + if (!event.animCancelled) { + for(char in event.characters) { + if (char == null) continue; - char.stunned = true; - char.playSingAnim(directionID, "miss", MISS); + if(event.stunned) char.stunned = true; + char.playSingAnim(directionID, event.animSuffix, MISS, event.forceAnim); + } } - if (strumLine != null && note != null) { + if (event.deleteNote && strumLine != null && note != null) strumLine.deleteNote(note); - } } @:dox(hide) @@ -1450,7 +1452,7 @@ class PlayState extends MusicBeatState var event:NoteHitEvent; if (strumLine != null && !strumLine.cpu) - event = scripts.event("onPlayerHit", EventManager.get(NoteHitEvent).recycle(false, !note.isSustainNote, !note.isSustainNote, note, strumLine.characters, true, note.noteType, note.animSuffix.getDefault(strumLine.altAnim ? "-alt" : ""), "game/score/", "", note.strumID, score, note.isSustainNote ? null : accuracy, note.noteData > 0 ? 0.023 : 0.004, daRating, Options.splashesEnabled && !note.isSustainNote && daRating == "sick")); + event = scripts.event("onPlayerHit", EventManager.get(NoteHitEvent).recycle(false, !note.isSustainNote, !note.isSustainNote, note, strumLine.characters, true, note.noteType, note.animSuffix.getDefault(strumLine.altAnim ? "-alt" : ""), "game/score/", "", note.strumID, score, note.isSustainNote ? null : accuracy, 0.023, daRating, Options.splashesEnabled && !note.isSustainNote && daRating == "sick")); else event = scripts.event("onDadHit", EventManager.get(NoteHitEvent).recycle(false, false, false, note, strumLine.characters, false, note.noteType, note.animSuffix.getDefault(strumLine.altAnim ? "-alt" : ""), "game/score/", "", note.strumID, 0, null, 0, daRating, false)); strumLine.onHit.dispatch(event); @@ -1465,7 +1467,7 @@ class PlayState extends MusicBeatState updateRating(); } if (event.countAsCombo) combo++; - + if (event.showRating || (event.showRating == null && event.player)) { displayCombo(event); diff --git a/source/funkin/game/StrumLine.hx b/source/funkin/game/StrumLine.hx index 422c84b4..6f5f62e9 100644 --- a/source/funkin/game/StrumLine.hx +++ b/source/funkin/game/StrumLine.hx @@ -17,11 +17,11 @@ class StrumLine extends FlxTypedGroup { */ public var onHit:FlxTypedSignalVoid> = new FlxTypedSignalVoid>(); /** - * Signal that triggers whenever a note is missed. Similar to onPlayerMiss and onDadMiss, except strumline specific. + * Signal that triggers whenever a note is missed. Similar to onPlayerMiss, except strumline specific. * To add a listener, do - * `strumLine.onMiss.add(function(e:NoteHitEvent) {});` + * `strumLine.onMiss.add(function(e:NoteMissEvent) {});` */ - public var onMiss:FlxTypedSignalVoid> = new FlxTypedSignalVoid>(); + public var onMiss:FlxTypedSignalVoid> = new FlxTypedSignalVoid>(); /** * Signal that triggers whenever a note is being updated. Similar to onNoteUpdate, except strumline specific. * To add a listener, do