From 6917828cf97167461c9516cb9cbf76ff5b1e4815 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=8D=9A=7ENex?= <87421482+NexIsDumb@users.noreply.github.com> Date: Sat, 17 Feb 2024 19:08:18 +0100 Subject: [PATCH] dialogues stuff & porting WIP 2 kinda rushed today sorryyy --- assets/data/dialogue/boxes/default.xml | 4 +- assets/data/dialogue/boxes/senpai.xml | 6 +- assets/data/dialogue/characters/senpai.xml | 4 ++ .../dialogue/boxes/pixel/dialogueBox.png | Bin 7200 -> 5828 bytes .../dialogue/boxes/pixel/dialogueBox.xml | 21 +++---- .../dialogue/characters/pixel/boyfriend.png | Bin 0 -> 6696 bytes .../dialogue/characters/pixel/boyfriend.xml | 15 +++++ .../dialogue/characters/pixel/senpai.png | Bin 0 -> 9631 bytes .../dialogue/characters/pixel/senpai.xml | 15 +++++ assets/songs/roses/dialogue.xml | 6 +- assets/songs/senpai/dialogue.xml | 6 +- assets/songs/thorns/creepyDialogue.xml | 12 ++-- source/funkin/backend/utils/XMLUtil.hx | 8 ++- .../game/cutscenes/dialogue/DialogueBox.hx | 1 + .../cutscenes/dialogue/DialogueCharacter.hx | 53 +++++++++++------- 15 files changed, 100 insertions(+), 51 deletions(-) create mode 100644 assets/data/dialogue/characters/senpai.xml create mode 100644 assets/images/dialogue/characters/pixel/boyfriend.png create mode 100644 assets/images/dialogue/characters/pixel/boyfriend.xml create mode 100644 assets/images/dialogue/characters/pixel/senpai.png create mode 100644 assets/images/dialogue/characters/pixel/senpai.xml diff --git a/assets/data/dialogue/boxes/default.xml b/assets/data/dialogue/boxes/default.xml index 99cf3859..f40a3196 100644 --- a/assets/data/dialogue/boxes/default.xml +++ b/assets/data/dialogue/boxes/default.xml @@ -2,7 +2,7 @@ + --> + --> diff --git a/assets/data/dialogue/boxes/senpai.xml b/assets/data/dialogue/boxes/senpai.xml index cb163d61..643f860a 100644 --- a/assets/data/dialogue/boxes/senpai.xml +++ b/assets/data/dialogue/boxes/senpai.xml @@ -2,8 +2,8 @@ - + --> + + --> \ No newline at end of file diff --git a/assets/data/dialogue/characters/senpai.xml b/assets/data/dialogue/characters/senpai.xml new file mode 100644 index 00000000..ffe5d244 --- /dev/null +++ b/assets/data/dialogue/characters/senpai.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/images/dialogue/boxes/pixel/dialogueBox.png b/assets/images/dialogue/boxes/pixel/dialogueBox.png index c7d88ff5f261031f981de2af93efac64700e6562..dbc7ae3edbd31e5a2f685033854ae27f141c7c7b 100644 GIT binary patch literal 5828 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 Am;e9( literal 7200 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 - - - - - - - - - + + + + + + + + + \ No newline at end of file diff --git a/assets/images/dialogue/characters/pixel/boyfriend.png b/assets/images/dialogue/characters/pixel/boyfriend.png new file mode 100644 index 0000000000000000000000000000000000000000..2756eaf0b06ededdcd6fa6d77e0e739132ca7458 GIT binary patch literal 6696 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 literal 0 HcmV?d00001 diff --git a/assets/images/dialogue/characters/pixel/boyfriend.xml b/assets/images/dialogue/characters/pixel/boyfriend.xml new file mode 100644 index 00000000..e4f6210a --- /dev/null +++ b/assets/images/dialogue/characters/pixel/boyfriend.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/images/dialogue/characters/pixel/senpai.png b/assets/images/dialogue/characters/pixel/senpai.png new file mode 100644 index 0000000000000000000000000000000000000000..4e60d8180235efd8836538e60691c59c249d3314 GIT binary patch literal 9631 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 + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/songs/roses/dialogue.xml b/assets/songs/roses/dialogue.xml index e058c1d5..4afba293 100644 --- a/assets/songs/roses/dialogue.xml +++ b/assets/songs/roses/dialogue.xml @@ -1,14 +1,14 @@ - + - + Not bad for an ugly worm. - + But this time I'll rip your nuts off right after your girlfriend finishes gargling mine. diff --git a/assets/songs/senpai/dialogue.xml b/assets/songs/senpai/dialogue.xml index 2b2a081a..0a8c62ed 100644 --- a/assets/songs/senpai/dialogue.xml +++ b/assets/songs/senpai/dialogue.xml @@ -1,14 +1,14 @@ - + - + Ah, a new fair maiden has come in search of true love! - + A serenade between gentlemen shall decide where her beautiful heart shall reside. diff --git a/assets/songs/thorns/creepyDialogue.xml b/assets/songs/thorns/creepyDialogue.xml index bfa5c80e..75ee0d15 100644 --- a/assets/songs/thorns/creepyDialogue.xml +++ b/assets/songs/thorns/creepyDialogue.xml @@ -1,22 +1,22 @@ - + - + Direct contact with real humans, after being trapped in here for so long... - + and HER of all people. - + I'll make her father pay for what he's done to me and all the others,,,, - + I'll beat you and make you take my place. - + You don't mind your bodies being borrowed right? It's only fair... \ No newline at end of file diff --git a/source/funkin/backend/utils/XMLUtil.hx b/source/funkin/backend/utils/XMLUtil.hx index 1d9aa526..7058ae28 100644 --- a/source/funkin/backend/utils/XMLUtil.hx +++ b/source/funkin/backend/utils/XMLUtil.hx @@ -1,10 +1,9 @@ package funkin.backend.utils; -import flixel.animation.FlxAnimation; import funkin.backend.FunkinSprite; import funkin.backend.system.ErrorCode; import funkin.backend.FunkinSprite.XMLAnimType; -import funkin.backend.system.interfaces.IBeatReceiver; +import flixel.util.FlxColor; import haxe.xml.Access; import funkin.backend.system.interfaces.IOffsetCompatible; @@ -138,12 +137,15 @@ class XMLUtil { } if (node.has.updateHitbox && node.att.updateHitbox == "true") spr.updateHitbox(); - if(node.has.zoomfactor) + if (node.has.zoomfactor) spr.zoomFactor = Std.parseFloat(node.getAtt("zoomfactor")).getDefault(spr.zoomFactor); if (node.has.alpha) spr.alpha = Std.parseFloat(node.getAtt("alpha")).getDefault(spr.alpha); + if(node.has.color) + spr.color = FlxColor.fromString(node.getAtt("color")).getDefault(0xFFFFFFFF); + if (node.has.playOnCountdown) spr.skipNegativeBeats = node.att.playOnCountdown == "true"; if (node.has.beatInterval) diff --git a/source/funkin/game/cutscenes/dialogue/DialogueBox.hx b/source/funkin/game/cutscenes/dialogue/DialogueBox.hx index 296be07c..f61e65c1 100644 --- a/source/funkin/game/cutscenes/dialogue/DialogueBox.hx +++ b/source/funkin/game/cutscenes/dialogue/DialogueBox.hx @@ -48,6 +48,7 @@ class DialogueBox extends FunkinSprite { text.color = textNode.getAtt("color").getColorFromDynamic().getDefault(0xFF000000); text.size = Std.parseInt(textNode.att.size).getDefault(20); text.font = Paths.font('${textNode.getAtt("font").getDefault("vcr.ttf")}'); + text.delay = Std.parseFloat(textNode.getAtt("delay")).getDefault(0.05); text.antialiasing = textNode.getAtt("antialiasing").getDefault("false") == "true"; text.sounds = [FlxG.sound.load(textTypeSFX)]; if(textNode.has.borderStyle) { diff --git a/source/funkin/game/cutscenes/dialogue/DialogueCharacter.hx b/source/funkin/game/cutscenes/dialogue/DialogueCharacter.hx index 32d241a8..db089b9d 100644 --- a/source/funkin/game/cutscenes/dialogue/DialogueCharacter.hx +++ b/source/funkin/game/cutscenes/dialogue/DialogueCharacter.hx @@ -6,23 +6,30 @@ import haxe.xml.Access; class DialogueCharacter extends FunkinSprite { public var charData:Access; public var curTween:FlxTween; - public var curTweenContext:DialogueCharTweenContext = NONE; + public var curAnimContext:DialogueCharAnimContext = NONE; public var positionName:String; + public var finishCallback:String->Void = null; public function new(name:String, position:String) { super(); this.positionName = position; try { charData = new Access(Xml.parse(Assets.getText(Paths.xml('dialogue/characters/$name'))).firstElement()); - loadSprite(Paths.image('dialogue/characters/${charData.getAtt('sprite').getDefault(name)}')); - antialiasing = charData.getAtt('antialiasing').getDefault('true') == 'true'; - scale.scale(charData.has.scale ? Std.parseFloat(charData.att.scale).getDefault(1) : 1); - updateHitbox(); - offset.set( - charData.has.x ? Std.parseFloat(charData.att.x).getDefault(0) : 0, - (charData.has.y ? Std.parseFloat(charData.att.y).getDefault(0) : 0) + this.height); - for(anim in charData.nodes.anim) - XMLUtil.addXMLAnimation(this, anim, true); + if(!charData.has.sprite) charData.x.set("sprite", name); + if(!charData.has.updateHitbox) charData.x.set("updateHitbox", "true"); + XMLUtil.loadSpriteFromXML(this, charData, "dialogue/characters/", LOOP); + + animation.finishCallback = (name:String) -> { + switch(name) + { + case 'show': hasAnimation('normal') ? playAnim('normal', true) : animation.stop(); + case 'hide': alpha = 0; + } + if(finishCallback != null) finishCallback(name); + } + + offset.set(x, y + height); + x = 0; y = 0; } catch(e) { Logs.trace('Failed to load dialogue character $name: ${e.toString()}', ERROR); } @@ -30,29 +37,33 @@ class DialogueCharacter extends FunkinSprite { } public function show(x:Float, y:Float) { - if (curTweenContext != (curTweenContext = POPIN)) { - setPosition(x, y + 100); - if (curTween != null) - curTween.cancel(); + if (curAnimContext == (curAnimContext = POPIN)) return; + if (hasAnimation('show')) { + playAnim('show', true); + setPosition(x, y); + } else { + setPosition(x, y + 100); + if(curTween != null) curTween.cancel(); + playAnim('normal', true); alpha = 0; - visible = true; - curTween = FlxTween.tween(this, {alpha: 1, y: y}, 0.2, {ease: FlxEase.quintOut}); } + visible = true; } public function hide() { - if (curTweenContext != (curTweenContext = POPOUT)) { - if (curTween != null) - curTween.cancel(); - + if (curAnimContext == (curAnimContext = POPOUT)) return; + + if(hasAnimation('hide')) playAnim('hide', true); + else { + if(curTween != null) curTween.cancel(); curTween = FlxTween.tween(this, {alpha: 0, y: y + 100}, 0.2, {ease: FlxEase.quintIn}); } } } -enum abstract DialogueCharTweenContext(Int) { +enum abstract DialogueCharAnimContext(Int) { var NONE = -1; var POPIN = 0; var POPOUT = 1;