From 541e371b7eab93c5abcd566120ec9200ab3fb581 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=8D=9A=7ENex?= <87421482+NexIsDumb@users.noreply.github.com> Date: Mon, 19 Feb 2024 02:34:58 +0100 Subject: [PATCH] dialogues stuff & porting WIP 4 --- assets/data/dialogue/characters/pixelBf.xml | 2 +- assets/data/dialogue/characters/senpai.xml | 2 +- assets/songs/roses/dialogue.xml | 2 +- assets/songs/senpai/dialogue.xml | 2 +- assets/songs/thorns/creepyDialogue.xml | 2 +- assets/sounds/{ => pixel}/ANGRY_TEXT_BOX.mp3 | Bin assets/sounds/{ => pixel}/ANGRY_TEXT_BOX.ogg | Bin assets/sounds/pixel/type.mp3 | Bin 0 -> 2001 bytes assets/sounds/pixel/type.wav | Bin 4546 -> 0 bytes .../funkin/game/cutscenes/DialogueCutscene.hx | 41 +++++++++++++++--- .../game/cutscenes/dialogue/DialogueBox.hx | 26 ++++++----- 11 files changed, 56 insertions(+), 21 deletions(-) rename assets/sounds/{ => pixel}/ANGRY_TEXT_BOX.mp3 (100%) rename assets/sounds/{ => pixel}/ANGRY_TEXT_BOX.ogg (100%) create mode 100644 assets/sounds/pixel/type.mp3 delete mode 100644 assets/sounds/pixel/type.wav diff --git a/assets/data/dialogue/characters/pixelBf.xml b/assets/data/dialogue/characters/pixelBf.xml index 5292d4de..1c071bb5 100644 --- a/assets/data/dialogue/characters/pixelBf.xml +++ b/assets/data/dialogue/characters/pixelBf.xml @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/assets/data/dialogue/characters/senpai.xml b/assets/data/dialogue/characters/senpai.xml index ffe5d244..855deb12 100644 --- a/assets/data/dialogue/characters/senpai.xml +++ b/assets/data/dialogue/characters/senpai.xml @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/assets/songs/roses/dialogue.xml b/assets/songs/roses/dialogue.xml index 904cf803..9995b7c3 100644 --- a/assets/songs/roses/dialogue.xml +++ b/assets/songs/roses/dialogue.xml @@ -5,7 +5,7 @@ - + Not bad for an ugly worm. diff --git a/assets/songs/senpai/dialogue.xml b/assets/songs/senpai/dialogue.xml index 5a0115c4..615c4f96 100644 --- a/assets/songs/senpai/dialogue.xml +++ b/assets/songs/senpai/dialogue.xml @@ -5,7 +5,7 @@ - + Ah, a new fair maiden has come in search of true love! diff --git a/assets/songs/thorns/creepyDialogue.xml b/assets/songs/thorns/creepyDialogue.xml index 75ee0d15..629eb492 100644 --- a/assets/songs/thorns/creepyDialogue.xml +++ b/assets/songs/thorns/creepyDialogue.xml @@ -4,7 +4,7 @@ - + Direct contact with real humans, after being trapped in here for so long... diff --git a/assets/sounds/ANGRY_TEXT_BOX.mp3 b/assets/sounds/pixel/ANGRY_TEXT_BOX.mp3 similarity index 100% rename from assets/sounds/ANGRY_TEXT_BOX.mp3 rename to assets/sounds/pixel/ANGRY_TEXT_BOX.mp3 diff --git a/assets/sounds/ANGRY_TEXT_BOX.ogg b/assets/sounds/pixel/ANGRY_TEXT_BOX.ogg similarity index 100% rename from assets/sounds/ANGRY_TEXT_BOX.ogg rename to assets/sounds/pixel/ANGRY_TEXT_BOX.ogg diff --git a/assets/sounds/pixel/type.mp3 b/assets/sounds/pixel/type.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..b7c76d21c46f8f75cee24d63d846ec4dbbf5c268 GIT binary patch literal 2001 zcmeZtF=l1}0p*b3U{@f`55zu+Wof47dZuQ2h6V;8NhtXL+u;C=4W}bA^U{GFkUpSE z>`NG034xP@z<)vjWI520$v{V%nSeMjpu$uNVX`lI9n_x-X8-?v;Rpi*hXix=76At3 zH%4#1n>IKk$foS}Tzk3BLV?4P!9jq9A-{u>p+^36^MfDtYvkE&1j+&gSZo|Pm=gZ8 zpZ|a4;eX*Kh6cqW42|a&NYwxTvmlY>Xy(#MEr+5C)k4xNkEu!>WOF=`c6rksg$oid z3=*eG>}0sf!t@}7d5vMDz~Ki<-4oYOw@hK`(b~FRGwpqnqPlfNrsIkB`8yuJcxR!r z)JM>F*19(K8$ywuiW!1m&-z`T?mg#Upx%x@+>FAl86>!5zQ{4Z~rgSWFk*6Ff~wP%#LnI)A)?Uw8JT>52=(mO3yZWWdV zMGSsDl8L%(TTY%-OXi-j!D~^PcVqhknbRCRkIL-17o6ap^r~IYEu+07f-~`#?kTY= zrW+=AF4!T)@F$$x!|CcetqfED$zO_1G&CPMJcZGZVg)u*rcX18<}Po%=dk6V_c6z_Sj@4IeJgm~e5!L&_oTQncKHA{U@ z-xsZP_~_G#kL_gU8tkxZmC7*MaB&;=ssC&q_xBXhiC^pKtmbB<# zqOgFhK||woc4@e`&uba&s#G=`>33_W&O=ZhmU1P?T(stc{9_x^sJcQy5d1@UAadC*QSal zdG5Gz)9tHo*x6HCwk584YHX(X>gJKTH&)qLuiiMt((Ay|oGPDvF>jMK*Jgh@6&iNN zt8%)RnqFkzmf4d|B);su-nVz7n%q5$DSeMw{{LQZX%*=W0t+_TUZL8@rQAZ^UlgVa^&CFUXCyy3A%DML7=$O|oNpw)|9>*quE|3QOO7Xz@O> zPiOC6kJ5Eh*C~aYyFC?}t{HSBVxs%YHEPU#@#&tSNkQeQmy!b8)cH@pIsESPlp|rY z&oe}?e%F85KG*1($b=(-_h;vwyKMPJ$$rioQ{NuX-`k7K&H0aN>K}^U9heii{pYDA zS@~aW-ih6rk#@%Dotx_9FOyE($=ma^BHE&I-u8!g3ln{v7;>MQDu<_TU0rLk>dx9f z(_D+DL@d95D)rO*H}m$sE^O%I)RZ_2UaQ-PMq zh1uC)`Ts8jj6G+zW!;-*CUoOig205xs0&^V;t%$pUh2x-v*6Usa=oW_j`T1jFtP+` zY5Q(HwT7EHIdT2N*=c#9;eo+fk~72q|C8Js8WrAlwKVi!c4+9sS^GlEvbz6CZcE$i zDJm!R$NSV=p{5Ple?+(XIQqI8>searnTApa{Qo`S$Oi_M#_Rq+_b@Q7R(xu|p@D%q LMvt08jSv6;05oLA literal 0 HcmV?d00001 diff --git a/assets/sounds/pixel/type.wav b/assets/sounds/pixel/type.wav deleted file mode 100644 index f2cb831a41bb71749e4f59ea8e67af4d0d26c384..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4546 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 J2qL+V{tv`}|2Y5v diff --git a/source/funkin/game/cutscenes/DialogueCutscene.hx b/source/funkin/game/cutscenes/DialogueCutscene.hx index 6bb1d6a3..210bae26 100644 --- a/source/funkin/game/cutscenes/DialogueCutscene.hx +++ b/source/funkin/game/cutscenes/DialogueCutscene.hx @@ -17,8 +17,8 @@ class DialogueCutscene extends Cutscene { public var curLine:DialogueLine = null; public var dialogueBox:DialogueBox; - public var nextSFX:FlxSound; public var dialogueCamera:FlxCamera; + public var curMusic:FlxSound = null; public function new(dialoguePath:String, callback:Void->Void) { super(callback); @@ -42,22 +42,38 @@ class DialogueCutscene extends Cutscene { add(charMap[char.att.name] = new DialogueCharacter(char.att.name, char.getAtt('position').getDefault('default'))); } + var useDef:Bool = false; + if(dialogueData.has.forceBoxDefaultTxtSound && dialogueData.att.forceBoxDefaultTxtSound == "true") + useDef = true; + // Add lines for(node in dialogueData.nodes.line) { - dialogueLines.push({ + var line:DialogueLine = { text: XMLUtil.fixXMLText(node.innerHTML), char: node.getAtt('char').getDefault('boyfriend'), bubble: node.getAtt('bubble').getDefault('normal'), callback: node.getAtt('callback'), - speed: node.has.speed ? Std.parseFloat(node.att.speed).getDefault(0.05) : 0.05 - }); + speed: node.has.speed ? Std.parseFloat(node.att.speed).getDefault(0.05) : 0.05, + changeMusic: node.has.changeMusic ? FlxG.sound.load(Paths.music(node.getAtt('changeMusic')), 0.8, true) : null, + playSound: node.has.playSound ? FlxG.sound.load(Paths.sound(node.getAtt('playSound'))) : null, + nextSound: node.has.nextSound ? FlxG.sound.load(Paths.music(node.getAtt('nextSound'))) : null, + textSound: null + }; + + if(node.has.textSound) line.textSound = FlxG.sound.load(Paths.sound(node.getAtt('textSound'))); + else if(!useDef) { + var char:DialogueCharacter = charMap[line.char]; + if(char != null && char.charData != null && char.charData.has.textSound) + line.textSound = FlxG.sound.load(Paths.sound(char.charData.getAtt("textSound"))); + } + + dialogueLines.push(line); } // Add dialogue box dialogueBox = new DialogueBox(dialogueData.getAtt("box").getDefault("default")); add(dialogueBox); add(dialogueBox.text); - next(); } catch(e) { @@ -84,10 +100,19 @@ class DialogueCutscene extends Cutscene { if (charMap[curLine.char] != null) dialogueBox.popupChar(charMap[curLine.char]); - dialogueBox.playBubbleAnim(curLine.bubble, curLine.text, curLine.speed); + dialogueBox.playBubbleAnim(curLine.bubble, curLine.text, curLine.speed, curLine.nextSound, curLine.textSound != null ? [curLine.textSound] : null); + + if(curLine.playSound != null) curLine.playSound.play(); + if(curLine.changeMusic != null) { + if(curMusic != null) curMusic.destroy(); + curMusic = curLine.changeMusic; + curMusic.play(); + curMusic.fadeIn(1, 0, curMusic.volume); + } } public override function destroy() { + if(curMusic != null) curMusic.destroy(); super.destroy(); FlxG.cameras.remove(dialogueCamera); } @@ -99,4 +124,8 @@ typedef DialogueLine = { var bubble:String; var callback:String; var speed:Float; + var changeMusic:FlxSound; + var playSound:FlxSound; + var nextSound:FlxSound; + var textSound:FlxSound; } \ No newline at end of file diff --git a/source/funkin/game/cutscenes/dialogue/DialogueBox.hx b/source/funkin/game/cutscenes/dialogue/DialogueBox.hx index 4604b353..4502f9e9 100644 --- a/source/funkin/game/cutscenes/dialogue/DialogueBox.hx +++ b/source/funkin/game/cutscenes/dialogue/DialogueBox.hx @@ -1,5 +1,6 @@ package funkin.game.cutscenes.dialogue; +import flixel.sound.FlxSound; import flixel.addons.text.FlxTypeText; import flixel.text.FlxText; import flixel.math.FlxPoint; @@ -10,13 +11,15 @@ class DialogueBox extends FunkinSprite { public var positions:Map = []; public var everPlayedAny:Bool = false; - public var textTypeSFX:String = Paths.sound('dialogue/text'); public var nextSFX:String = Paths.sound('dialogue/next'); + public var defaultTextTypeSFX:Array; public var text:FlxTypeText; public function new(name:String) { super(); + var textTypeSFX:String = Paths.sound('dialogue/text'); + try { dialogueBoxData = new Access(Xml.parse(Assets.getText(Paths.xml('dialogue/boxes/$name'))).firstElement()); if(!dialogueBoxData.has.sprite) dialogueBoxData.x.set("sprite", name); @@ -31,9 +34,10 @@ class DialogueBox extends FunkinSprite { if(dialogueBoxData.has.nextSound) nextSFX = Paths.sound(dialogueBoxData.att.nextSound); animation.finishCallback = (name:String) -> { - if(name.endsWith("-open") || name.endsWith("-firstOpen")) { - playAnim(name.substr(0, name.length - 5)); - setText(__nextText, __speed); + var finalPt:String; + if(name.endsWith(finalPt = "-open") || name.endsWith(finalPt = "-firstOpen")) { + playAnim(name.substr(0, name.length - finalPt.length)); + setText(__nextText, __speed, __customTypeSFX); } } @@ -57,7 +61,6 @@ class DialogueBox extends FunkinSprite { text.size = Std.parseInt(textNode.att.size).getDefault(20); text.font = Paths.font('${textNode.getAtt("font").getDefault("vcr.ttf")}'); text.antialiasing = textNode.getAtt("antialiasing").getDefault("false") == "true"; - text.sounds = [FlxG.sound.load(textTypeSFX)]; if(textNode.has.borderStyle) { text.borderStyle = switch(textNode.att.borderStyle.trim().toLowerCase()) { case "none": NONE; @@ -72,8 +75,8 @@ class DialogueBox extends FunkinSprite { active = false; Logs.trace('Couldn\'t load dialogue box "$name": ${e.toString()}', ERROR); } + defaultTextTypeSFX = [FlxG.sound.load(textTypeSFX)]; FlxG.sound.cache(nextSFX); - FlxG.sound.cache(textTypeSFX); } public function popupChar(char:DialogueCharacter) { @@ -86,22 +89,25 @@ class DialogueBox extends FunkinSprite { private var __nextText:String; private var __speed:Float; - public function playBubbleAnim(bubble:String, text:String, speed:Float = 0.05) { + private var __customTypeSFX:Array; + public function playBubbleAnim(bubble:String, text:String, speed:Float = 0.05, ?customSFX:FlxSound, ?customTypeSFX:Array, ?playNext:Bool) { this.__nextText = text; this.__speed = speed; + this.__customTypeSFX = customTypeSFX; this.text.resetText(text); - FlxG.sound.play(nextSFX); + if(playNext || (playNext == null && everPlayedAny)) customSFX != null ? customSFX.play() : FlxG.sound.play(nextSFX); if(hasAnimation('$bubble-open')) playAnim('$bubble-open', true); else if(hasAnimation('$bubble-firstOpen') && !everPlayedAny) playAnim('$bubble-firstOpen', true); else { playAnim(bubble); - setText(__nextText, __speed); + setText(__nextText, __speed, __customTypeSFX); } visible = true; everPlayedAny = true; } - public function setText(text:String, speed:Float = 0.02) { + public function setText(text:String, speed:Float = 0.02, ?customTypeSFX:Array) { + this.text.sounds = customTypeSFX != null ? customTypeSFX : defaultTextTypeSFX; this.text.delay = speed; this.text.start(speed, true); }