From 7cc41487426998b6ea9085e9038098b45bc88934 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=8D=9A=7ENex?= <87421482+NexIsDumb@users.noreply.github.com> Date: Sat, 24 Feb 2024 01:56:04 +0100 Subject: [PATCH] dialogues stuff & porting WIP 7 --- README.md | 1 - TODO.md | 2 +- .../data/dialogue/boxes/hating-simulator.hx | 61 ++++++++++++++++++ .../data/dialogue/boxes/hating-simulator.xml | 8 +-- assets/data/dialogue/characters/senpai.xml | 2 +- .../stages/school/ui/dialogueBox-evil.png | Bin 209 -> 0 bytes .../stages/school/ui/dialogueBox-evil.xml | 17 ----- .../stages/school/ui/dialogueBox-pixel.png | Bin 2695 -> 0 bytes .../stages/school/ui/dialogueBox-pixel.xml | 10 --- .../school/ui/dialogueBox-senpaiMad.png | Bin 8675 -> 0 bytes .../school/ui/dialogueBox-senpaiMad.xml | 13 ---- .../events/DialogueBoxCreationEvent.hx | 11 ---- .../events/DialogueBoxPlayBubbleEvent.hx | 6 +- .../events/DialogueCharCreationEvent.hx | 11 ---- .../funkin/game/cutscenes/DialogueCutscene.hx | 43 +++++++++--- .../game/cutscenes/dialogue/DialogueBox.hx | 61 ++++++------------ .../cutscenes/dialogue/DialogueCharacter.hx | 18 ++---- 17 files changed, 132 insertions(+), 132 deletions(-) create mode 100644 assets/data/dialogue/boxes/hating-simulator.hx delete mode 100644 assets/images/stages/school/ui/dialogueBox-evil.png delete mode 100644 assets/images/stages/school/ui/dialogueBox-evil.xml delete mode 100644 assets/images/stages/school/ui/dialogueBox-pixel.png delete mode 100644 assets/images/stages/school/ui/dialogueBox-pixel.xml delete mode 100644 assets/images/stages/school/ui/dialogueBox-senpaiMad.png delete mode 100644 assets/images/stages/school/ui/dialogueBox-senpaiMad.xml delete mode 100644 source/funkin/backend/scripting/events/DialogueBoxCreationEvent.hx delete mode 100644 source/funkin/backend/scripting/events/DialogueCharCreationEvent.hx diff --git a/README.md b/README.md index 0f623784..09823177 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,6 @@ ### Mods created with beta versions of Codename may not be compatible with the release version Known issues in the beta: - Some options are missing -- Week 6 still have no dialogue Build instructions are below. Press TAB on the main menu to switch mods. diff --git a/TODO.md b/TODO.md index d2bc473e..66ba0373 100644 --- a/TODO.md +++ b/TODO.md @@ -41,7 +41,7 @@ - [ ] New Switch Mod menu - [x] Port shader camera stuff over to new flixel fork - [ ] Add note offset -- [ ] Dialogue +- [x] Dialogue - [ ] Finish Base Game port - [x] Add credits - [ ] Verbose mode (`--verbose`) diff --git a/assets/data/dialogue/boxes/hating-simulator.hx b/assets/data/dialogue/boxes/hating-simulator.hx new file mode 100644 index 00000000..24aa06fd --- /dev/null +++ b/assets/data/dialogue/boxes/hating-simulator.hx @@ -0,0 +1,61 @@ +var bgFade:FlxSprite; +var hand:FlxSprite; + +function postCreate() { + bgFade = new FlxSprite().makeSolid(FlxG.width + 100, FlxG.height + 100, 0xFFB3DFd8); + bgFade.screenCenter(); + bgFade.scrollFactor.set(); + bgFade.alpha = 0; + cutscene.insert(0, bgFade); + + new FlxTimer().start(0.83, function(tmr:FlxTimer) + { + bgFade.alpha += (1 / 5) * 0.7; + if (bgFade.alpha > 0.7) + bgFade.alpha = 0.7; + }, 5); + + hand = new FlxSprite(0, 600).loadGraphic(Paths.image('stages/school/ui/hand_textbox')); + hand.scale.set(4, 4); + hand.updateHitbox(); +} + +var finished:Bool = false; +function close(event) { + if(finished) return; + else event.cancelled = true; + cutscene.canProceed = false; + + if(cutscene.curMusic != null) { + cutscene.curMusic.persist = true; + cutscene.curMusic.fadeOut(2.2, 0); + cutscene.curMusic.fadeTween.onComplete = (_) -> cutscene.curMusic.destroy(); + } + + for(c in cutscene.charMap) c.visible = false; + new FlxTimer().start(0.2, function(tmr:FlxTimer) + { + if (tmr.elapsedLoops <= 5) { + cutscene.dialogueBox.alpha -= 1 / 5; + cutscene.dialogueBox.text.alpha -= 1 / 5; + bgFade.alpha -= (1 / 5) * 0.7; + hand.alpha -= 1 / 5; + } else { + finished = true; + cutscene.close(); + } + }, 6); +} + +var time:Float = 0; +function update(elapsed:Float) { + hand.x = 1060 + Math.sin((time += elapsed) * Math.PI * 2) * 12; + hand.x -= hand.x % hand.scale.x; + hand.y -= hand.y % hand.scale.y; +} + +function postPlayBubbleAnim() { + cutscene.remove(hand); + if(active && visible) + cutscene.add(hand); +} \ No newline at end of file diff --git a/assets/data/dialogue/boxes/hating-simulator.xml b/assets/data/dialogue/boxes/hating-simulator.xml index 5e9e6595..34828b61 100644 --- a/assets/data/dialogue/boxes/hating-simulator.xml +++ b/assets/data/dialogue/boxes/hating-simulator.xml @@ -1,21 +1,21 @@ - + - + - + - + \ No newline at end of file diff --git a/assets/data/dialogue/characters/senpai.xml b/assets/data/dialogue/characters/senpai.xml index 6c33e08e..a87de32a 100644 --- a/assets/data/dialogue/characters/senpai.xml +++ b/assets/data/dialogue/characters/senpai.xml @@ -1,5 +1,5 @@ - + \ No newline at end of file diff --git a/assets/images/stages/school/ui/dialogueBox-evil.png b/assets/images/stages/school/ui/dialogueBox-evil.png deleted file mode 100644 index 1b99a05bdfbc165903f4d447a5f4c233952f0b98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 209 zcmeAS@N?(olHy`uVBq!ia0y~yU;;9k7#Nv>)VXbLJAo8ifKP}kkOqRK={wH@DaMi@ zzhDN3XE)M-oJvm@$B>F!Z_ga$Y%maDa13_*^k#M_Z&NVBiT4P#6TB1wX#jw)aS^u>lO6kc7xEoLPJ - - - - - - - - - - - - - - - - diff --git a/assets/images/stages/school/ui/dialogueBox-pixel.png b/assets/images/stages/school/ui/dialogueBox-pixel.png deleted file mode 100644 index fb93a1146500c8718fcf410e2b700dd49e1dfb94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2695 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 za - - - - - - - - - diff --git a/assets/images/stages/school/ui/dialogueBox-senpaiMad.png b/assets/images/stages/school/ui/dialogueBox-senpaiMad.png deleted file mode 100644 index 4df2c855946e77f961209406e0fe59323351dae3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8675 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 - - - - - - - - - - - - diff --git a/source/funkin/backend/scripting/events/DialogueBoxCreationEvent.hx b/source/funkin/backend/scripting/events/DialogueBoxCreationEvent.hx deleted file mode 100644 index 781c5399..00000000 --- a/source/funkin/backend/scripting/events/DialogueBoxCreationEvent.hx +++ /dev/null @@ -1,11 +0,0 @@ -package funkin.backend.scripting.events; - -/** - * CANCEL this event to customize from 0 the creation part! - */ -final class DialogueBoxCreationEvent extends CancellableEvent -{ - public var name:String; - - public var textTypeSFX:String; -} \ No newline at end of file diff --git a/source/funkin/backend/scripting/events/DialogueBoxPlayBubbleEvent.hx b/source/funkin/backend/scripting/events/DialogueBoxPlayBubbleEvent.hx index 0613603e..0baf7a65 100644 --- a/source/funkin/backend/scripting/events/DialogueBoxPlayBubbleEvent.hx +++ b/source/funkin/backend/scripting/events/DialogueBoxPlayBubbleEvent.hx @@ -6,6 +6,8 @@ final class DialogueBoxPlayBubbleEvent extends CancellableEvent { public var bubble:String; + public var suffix:String; + public var text:String; public var speed:Float; @@ -14,5 +16,7 @@ final class DialogueBoxPlayBubbleEvent extends CancellableEvent public var customTypeSFX:Array; - public var playNext:Null; + public var setTextAfter:Bool; + + public var allowDefault:Bool; } \ No newline at end of file diff --git a/source/funkin/backend/scripting/events/DialogueCharCreationEvent.hx b/source/funkin/backend/scripting/events/DialogueCharCreationEvent.hx deleted file mode 100644 index d3694d0d..00000000 --- a/source/funkin/backend/scripting/events/DialogueCharCreationEvent.hx +++ /dev/null @@ -1,11 +0,0 @@ -package funkin.backend.scripting.events; - -/** - * CANCEL this event to customize from 0 the creation part! - */ -final class DialogueCharCreationEvent extends CancellableEvent -{ - public var name:String; - - public var position:String; -} \ No newline at end of file diff --git a/source/funkin/game/cutscenes/DialogueCutscene.hx b/source/funkin/game/cutscenes/DialogueCutscene.hx index 18ce6e39..7daa78e6 100644 --- a/source/funkin/game/cutscenes/DialogueCutscene.hx +++ b/source/funkin/game/cutscenes/DialogueCutscene.hx @@ -16,7 +16,8 @@ class DialogueCutscene extends Cutscene { public var charMap:Map = []; public var dialogueLines:Array = []; - public var curLine:DialogueLine = null; + public var curLine(default, set):DialogueLine = null; + public var lastLine:DialogueLine = null; public var dialogueBox:DialogueBox; public var dialogueCamera:FlxCamera; @@ -25,6 +26,11 @@ class DialogueCutscene extends Cutscene { public static var cutscene:DialogueCutscene; //public var dialogueScript:Script; + public function set_curLine(val:DialogueLine) { + lastLine = curLine; + return curLine = val; + } + public function new(dialoguePath:String, callback:Void->Void) { super(callback); this.dialoguePath = dialoguePath; @@ -85,22 +91,30 @@ class DialogueCutscene extends Cutscene { add(dialogueBox); add(dialogueBox.text); - next(); + next(true); } catch(e) { - Logs.trace('Error while loading dialogue at ${dialoguePath}', ERROR); + Logs.trace('Error while loading dialogue at ${dialoguePath}: ${e.toString()}', ERROR); close(); } } public override function update(elapsed:Float) { super.update(elapsed); - if (controls.ACCEPT) - next(); + if(controls.ACCEPT) next(); } - public function next() { + public var canProceed:Bool = true; + public function next(playFirst:Bool = false) { + if(!canProceed) return; + if ((curLine = dialogueLines.shift()) == null) { - close(); + if(lastLine != null && dialogueBox.hasAnimation(lastLine.bubble + "-close")) { + dialogueBox.playBubbleAnim(lastLine.bubble, "-close"); + dialogueBox.animation.finishCallback = (_) -> close(); + } else { + FlxG.sound.play(dialogueBox.nextSFX); + close(); + } return; } @@ -115,7 +129,8 @@ class DialogueCutscene extends Cutscene { dialogueBox.popupChar(char, force); } - dialogueBox.playBubbleAnim(curLine.bubble, curLine.text, curLine.speed, curLine.nextSound, curLine.textSound != null ? [curLine.textSound] : null); + var finalSuffix:String = playFirst && dialogueBox.hasAnimation(curLine.bubble + "-firstOpen") ? "-firstOpen" : dialogueBox.hasAnimation(curLine.bubble + "-open") ? "-open" : ""; + dialogueBox.playBubbleAnim(curLine.bubble, finalSuffix, curLine.text, curLine.speed, curLine.nextSound, curLine.textSound != null ? [curLine.textSound] : null, finalSuffix == "-firstOpen" || finalSuffix == "-open", !playFirst); if(curLine.playSound != null) curLine.playSound.play(); if(curLine.changeMusic != null) { @@ -126,8 +141,18 @@ class DialogueCutscene extends Cutscene { } } + public override function close() { + var event = new CancellableEvent(); + for(c in charMap) c.dialogueCharScript.call("close", [event]); + dialogueBox.dialogueBoxScript.call("close", [event]); + if(event.cancelled) + return; + + super.close(); + } + public override function destroy() { - if(curMusic != null) curMusic.destroy(); + if(curMusic != null && !curMusic.persist) curMusic.destroy(); super.destroy(); cutscene = null; FlxG.cameras.remove(dialogueCamera); diff --git a/source/funkin/game/cutscenes/dialogue/DialogueBox.hx b/source/funkin/game/cutscenes/dialogue/DialogueBox.hx index cb8aac13..d5614b36 100644 --- a/source/funkin/game/cutscenes/dialogue/DialogueBox.hx +++ b/source/funkin/game/cutscenes/dialogue/DialogueBox.hx @@ -13,8 +13,6 @@ import haxe.xml.Access; class DialogueBox extends FunkinSprite { public var dialogueBoxData:Access; public var positions:Map = []; - public var everPlayedAny:Bool = false; - public var finishAnimCallback:String->Void = null; public var nextSFX:String = Paths.sound('dialogue/next'); public var defaultTextTypeSFX:Array; @@ -32,19 +30,14 @@ class DialogueBox extends FunkinSprite { dialogueBoxScript.setParent(this); dialogueBoxScript.load(); - var event = EventManager.get(DialogueBoxCreationEvent).recycle(name, textTypeSFX); + var event = EventManager.get(DialogueBoxStructureEvent).recycle(name, textTypeSFX, null); dialogueBoxScript.call('create', [event]); - if(event.cancelled) - return; - name = event.name; - textTypeSFX = event.textTypeSFX; + if(event.cancelled) return; // No idea the pyscho that would do this but hey, it can happen - Nex try { - dialogueBoxData = new Access(Xml.parse(Assets.getText(Paths.xml(defPath + name))).firstElement()); - var event = EventManager.get(DialogueBoxStructureEvent).recycle(name, textTypeSFX, dialogueBoxData); + event.dialogueBoxData = dialogueBoxData = new Access(Xml.parse(Assets.getText(Paths.xml(defPath + event.name))).firstElement()); dialogueBoxScript.call('structureLoaded', [event]); - if(event.cancelled) - return; + if(event.cancelled) return; name = event.name; textTypeSFX = event.textTypeSFX; dialogueBoxData = event.dialogueBoxData; @@ -60,16 +53,6 @@ class DialogueBox extends FunkinSprite { if(dialogueBoxData.has.textSound) textTypeSFX = Paths.sound(dialogueBoxData.att.textSound); if(dialogueBoxData.has.nextSound) nextSFX = Paths.sound(dialogueBoxData.att.nextSound); - animation.finishCallback = (name:String) -> { - if(finishAnimCallback != null) finishAnimCallback(name); - - var finalPt:String; - if(name.endsWith(finalPt = "-open") || name.endsWith(finalPt = "-firstOpen")) { - playAnim(name.substr(0, name.length - finalPt.length)); - setText(__nextText, __speed, __customTypeSFX); - } - } - for(pos in dialogueBoxData.nodes.charpos) { if (!pos.has.name) continue; positions[pos.att.name] = { @@ -112,8 +95,7 @@ class DialogueBox extends FunkinSprite { public override function playAnim(AnimName:String, Force:Bool = false, Context:PlayAnimContext = NONE, Reversed:Bool = false, Frame:Int = 0) { var event = EventManager.get(PlayAnimEvent).recycle(AnimName, Force, Reversed, Frame, Context); dialogueBoxScript.call("onPlayAnim", [event]); - if (event.cancelled) - return; + if(event.cancelled) return; super.playAnim(event.animName, event.force, event.context, event.reverse, event.startingFrame); } @@ -138,36 +120,33 @@ class DialogueBox extends FunkinSprite { event.char.show((FlxG.width / 2) + pos.x, FlxG.height - pos.y, null, force); } - private var __nextText:String; - private var __speed:Float; - private var __customTypeSFX:Array; - public function playBubbleAnim(bubble:String, text:String, speed:Float = 0.05, ?customSFX:FlxSound, ?customTypeSFX:Array, ?playNext:Bool) { - var event = EventManager.get(DialogueBoxPlayBubbleEvent).recycle(bubble, text, speed, customSFX, customTypeSFX, playNext); + public function playBubbleAnim(bubble:String, suffix:String = '', text:String = '', speed:Float = 0.05, ?customSFX:FlxSound, ?customTypeSFX:Array, setTextAfter:Bool = false, allowDefault:Bool = true) { + var event = EventManager.get(DialogueBoxPlayBubbleEvent).recycle(bubble, suffix, text, speed, customSFX, customTypeSFX, setTextAfter, allowDefault); dialogueBoxScript.call("playBubbleAnim", [event]); - if (event.cancelled) - return; + if(event.cancelled) return; + + if(event.customSFX != null) event.customSFX.play(); + else if(event.allowDefault) FlxG.sound.play(nextSFX); + var idk:Void->Void = () -> if(text != null && text.trim().length > 0) setText(event.text, event.speed, event.customTypeSFX); - this.__nextText = event.text; - this.__speed = event.speed; - this.__customTypeSFX = event.customTypeSFX; this.text.resetText(''); - if(event.playNext || (event.playNext == null && everPlayedAny)) event.customSFX != null ? event.customSFX.play() : FlxG.sound.play(nextSFX); - if(hasAnimation('${event.bubble}-open')) playAnim('${event.bubble}-open', true); - else if(hasAnimation('${event.bubble}-firstOpen') && !everPlayedAny) playAnim('${event.bubble}-firstOpen', true); - else { + var anim:String = event.bubble + event.suffix; + if(hasAnimation(anim)) playAnim(anim, true); + if(!event.setTextAfter) idk(); + else animation.finishCallback = (name:String) -> { + if(name != anim) return; playAnim(event.bubble); - setText(__nextText, __speed, __customTypeSFX); + idk(); animation.finishCallback = null; } + visible = true; - everPlayedAny = true; dialogueBoxScript.call("postPlayBubbleAnim", [event]); } public function setText(text:String, speed:Float = 0.05, ?customTypeSFX:Array) { var event = EventManager.get(DialogueBoxSetTextEvent).recycle(text, speed, customTypeSFX); dialogueBoxScript.call("setText", [event]); - if (event.cancelled) - return; + if(event.cancelled) return; this.text.resetText(event.text); this.text.sounds = event.customTypeSFX != null ? event.customTypeSFX : defaultTextTypeSFX; diff --git a/source/funkin/game/cutscenes/dialogue/DialogueCharacter.hx b/source/funkin/game/cutscenes/dialogue/DialogueCharacter.hx index a7ee70ed..223d2111 100644 --- a/source/funkin/game/cutscenes/dialogue/DialogueCharacter.hx +++ b/source/funkin/game/cutscenes/dialogue/DialogueCharacter.hx @@ -27,21 +27,16 @@ class DialogueCharacter extends FunkinSprite { dialogueCharScript.setParent(this); dialogueCharScript.load(); - var event = EventManager.get(DialogueCharCreationEvent).recycle(name, position); + var event = EventManager.get(DialogueCharStructureEvent).recycle(name, position, null); dialogueCharScript.call('create', [event]); // Its not really create() since its inside new() but, nah, it makes no difference at least here - Nex - if(event.cancelled) - return; // No idea the pyscho that would do this but hey, it can happen - Nex - name = event.name; - position = event.position; + if(event.cancelled) return; try { - charData = new Access(Xml.parse(Assets.getText(Paths.xml(defPath + name))).firstElement()); - var event = EventManager.get(DialogueCharStructureEvent).recycle(name, position, charData); + event.charData = charData = new Access(Xml.parse(Assets.getText(Paths.xml(defPath + event.name))).firstElement()); dialogueCharScript.call('structureLoaded', [event]); - if(event.cancelled) - return; + if(event.cancelled) return; name = event.name; - this.positionName = event.position; + positionName = event.position; charData = event.charData; if(!charData.has.sprite) charData.x.set("sprite", name); @@ -69,8 +64,7 @@ class DialogueCharacter extends FunkinSprite { public override function playAnim(AnimName:String, Force:Bool = false, Context:PlayAnimContext = NONE, Reversed:Bool = false, Frame:Int = 0) { var event = EventManager.get(PlayAnimEvent).recycle(AnimName, Force, Reversed, Frame, Context); dialogueCharScript.call("playAnim", [event]); - if (event.cancelled) - return; + if(event.cancelled) return; super.playAnim(event.animName, event.force, event.context, event.reverse, event.startingFrame); }