diff --git a/assets/data/alphabet/normal.xml b/assets/data/alphabet/normal.xml index 081fce8b..69b7faff 100644 --- a/assets/data/alphabet/normal.xml +++ b/assets/data/alphabet/normal.xml @@ -17,6 +17,7 @@ period question mark start parentheses + - ^ ~ = diff --git a/project.xml b/project.xml index 29b3a899..017d8ba8 100644 --- a/project.xml +++ b/project.xml @@ -153,9 +153,6 @@ - - - diff --git a/source/funkin/backend/system/MainState.hx b/source/funkin/backend/system/MainState.hx index c9e19aa3..17b3587f 100644 --- a/source/funkin/backend/system/MainState.hx +++ b/source/funkin/backend/system/MainState.hx @@ -61,16 +61,12 @@ class MainState extends FlxState { EventsData.reloadEvents(); TitleState.initialized = false; - #if (ALPHABET_TESTING) - FlxG.switchState(new funkin.menus.ui.NewAlphabetTest()); - #else if (betaWarningShown) FlxG.switchState(new TitleState()); else { FlxG.switchState(new BetaWarningState()); betaWarningShown = true; } - #end CoolUtil.safeAddAttributes('./.temp/', NativeAPI.FileAttribute.HIDDEN); } diff --git a/source/funkin/menus/ui/NewAlphabet.hx b/source/funkin/menus/ui/NewAlphabet.hx index 1ff8492f..13626425 100644 --- a/source/funkin/menus/ui/NewAlphabet.hx +++ b/source/funkin/menus/ui/NewAlphabet.hx @@ -144,9 +144,10 @@ class NewAlphabet extends FlxSprite { var ogRed:Float = colorTransform.redMultiplier; var ogGreen:Float = colorTransform.greenMultiplier; var ogBlue:Float = colorTransform.blueMultiplier; + var ogAlpha:Float = colorTransform.alphaMultiplier; for (i in 0...daText.length) { - __renderData.reset(this, daText.charAt(i)); + __renderData.reset(this, ogRed, ogGreen, ogBlue, ogAlpha, daText.charAt(i)); for (effect in effects) { if (effect.willModify(i, i - lastLine, __renderData)) effect.modify(i, i - lastLine, __renderData); @@ -164,7 +165,7 @@ class NewAlphabet extends FlxSprite { var anim = getLetterAnim(letter); var advance:Float = getAdvance(letter, anim); - if (anim == null) { + if (anim == null || __renderData.alpha <= 0.0) { frameOffset.x -= advance; } else { var frameToGet = Math.floor(__animTime * fps) % anim.numFrames; @@ -184,7 +185,7 @@ class NewAlphabet extends FlxSprite { shader.setCamSize(_frame.frame.x, _frame.frame.y, _frame.frame.width, _frame.frame.height); setColorTransform( - __renderData.red * transformMult, __renderData.green * transformMult, __renderData.blue * transformMult, colorTransform.alphaMultiplier, + __renderData.red * transformMult, __renderData.green * transformMult, __renderData.blue * transformMult, __renderData.alpha, Math.round(__renderData.red * offsetMult), Math.round(__renderData.green * offsetMult), Math.round(__renderData.blue * offsetMult), 0 ); super.drawComplex(camera); @@ -192,11 +193,9 @@ class NewAlphabet extends FlxSprite { frameOffset.x -= offsetX; frameOffset.x -= advance; } - colorTransform.redMultiplier = ogRed; - colorTransform.greenMultiplier = ogGreen; - colorTransform.blueMultiplier = ogBlue; } - + + setColorTransform(ogRed, ogGreen, ogBlue, ogAlpha, 0, 0, 0, 0); frameOffset.set(ogOffX, ogOffY); } @@ -279,6 +278,42 @@ class NewAlphabet extends FlxSprite { return animation.getByName(char); } + function checkNode(node:Xml) { + switch (node.nodeName) { + case "spritesheet": + if (frames == null) + frames = Paths.getFrames(node.firstChild().nodeValue); + else { + for (frame in Paths.getFrames(node.firstChild().nodeValue).frames) + frames.pushFrame(frame); + } + case "defaultAnim": + defaults.set(node.get("casing").getDefault("").toUpperCase(), node.firstChild().nodeValue); + case "anim": + var char = node.get("char"); + anims.set(char, node.firstChild().nodeValue); + if (node.exists("advance")) { + var advance = Std.parseFloat(node.get("advance")).getDefault(defaultAdvance); + advances.set(char, advance); + } + if (node.exists("x")) { + // negative since flixel is weird + var xOff = -Std.parseFloat(node.get("x")).getDefault(0.0); + xOffset.set(char, xOff); + } + if (node.exists("y")) { + var yOff = Std.parseFloat(node.get("y")).getDefault(0.0); + yOffset.set(char, yOff); + } + case "languageSection": + var langs = [for (lang in node.get("langs").split(",")) lang.trim()]; + if (langs.contains(Options.language)) { + for (langNode in node.elements()) + checkNode(langNode); + } + } + } + function loadFont(value:String) { __queueResize = true; @@ -298,30 +333,10 @@ class NewAlphabet extends FlxSprite { forceCase = xml.get("forceCasing").getDefault("none").toLowerCase(); transformMult = (xml.get("useColorOffsets") == "true") ? 0 : 1; - for (node in xml.elements()) { - switch (node.nodeName) { - case "spritesheet": - frames = Paths.getFrames(node.firstChild().nodeValue); - case "defaultAnim": - defaults.set(node.get("casing").getDefault("").toUpperCase(), node.firstChild().nodeValue); - case "anim": - var char = node.get("char"); - anims.set(char, node.firstChild().nodeValue); - if (node.exists("advance")) { - var advance = Std.parseFloat(node.get("advance")).getDefault(defaultAdvance); - advances.set(char, advance); - } - if (node.exists("x")) { - // negative since flixel is weird - var xOff = -Std.parseFloat(node.get("x")).getDefault(0.0); - xOffset.set(char, xOff); - } - if (node.exists("y")) { - var yOff = Std.parseFloat(node.get("y")).getDefault(0.0); - yOffset.set(char, yOff); - } - } - } + frames = null; + + for (node in xml.elements()) + checkNode(node); } override function destroy() { diff --git a/source/funkin/menus/ui/NewAlphabetTest.hx b/source/funkin/menus/ui/NewAlphabetTest.hx deleted file mode 100644 index 035a7a2e..00000000 --- a/source/funkin/menus/ui/NewAlphabetTest.hx +++ /dev/null @@ -1,30 +0,0 @@ -package funkin.menus.ui; - -#if (ALPHABET_TESTING) -/** - * TEMPORARY CLASS. - */ -class NewAlphabetTest extends MusicBeatState { - var alphabet:NewAlphabet; - - override function create() { - super.create(); - MusicBeatState.skipTransIn = true; - bgColor = 0xFF808080; - - alphabet = new NewAlphabet(100, 360, "bold"); - alphabet.text = "hi tarr\ninsert smiley face"; - alphabet.alignment = CENTER; - add(alphabet); - } - - override function update(elapsed:Float) { - super.update(elapsed); - if (controls.BACK) { - if (FlxG.sound.music != null) - FlxG.sound.music.stop(); - FlxG.resetState(); - } - } -} -#end \ No newline at end of file diff --git a/source/funkin/menus/ui/effects/RegionEffect.hx b/source/funkin/menus/ui/effects/RegionEffect.hx index ccc60e63..1eac1025 100644 --- a/source/funkin/menus/ui/effects/RegionEffect.hx +++ b/source/funkin/menus/ui/effects/RegionEffect.hx @@ -11,17 +11,21 @@ class AlphabetRenderData { public var red:Float = 0; public var green:Float = 0; public var blue:Float = 0; + public var alpha:Float = 1; public function new(parent:NewAlphabet) { this.parent = parent; } - public function reset(parent:NewAlphabet, letter:String) { + public function reset(parent:NewAlphabet, red:Float, green:Float, blue:Float, alpha:Float, letter:String) { this.parent = parent; this.letter = letter; - offsetX = 0; - offsetY = 0; - color = 0xFFFFFFFF; + this.offsetX = 0; + this.offsetY = 0; + this.red = red; + this.green = green; + this.blue = blue; + this.alpha = alpha; } function get_color():FlxColor { diff --git a/source/funkin/menus/ui/effects/TypeEffect.hx b/source/funkin/menus/ui/effects/TypeEffect.hx new file mode 100644 index 00000000..808877ba --- /dev/null +++ b/source/funkin/menus/ui/effects/TypeEffect.hx @@ -0,0 +1,52 @@ +package funkin.menus.ui.effects; + +import flixel.tweens.FlxEase; +import funkin.menus.ui.effects.RegionEffect; + +class TypeEffect extends RegionEffect { + public var interval:Float = 0.075; + var lastIndex:Int = -1; + // These let you make the text do a cool fade in when it appears. + public var alphaStart:Float = 1; + public var alphaEase:EaseFunction = FlxEase.quadOut; + // More stuff for fade in, this adds a y offset. + public var offsetStart:Float = 0.0; + public var offsetEase:EaseFunction = FlxEase.quadOut; + // Funny noises. You just kinda `effect.addSound(PATH)` and boom. + public var sounds:Array = []; + public var randomSound:Bool = true; // do them in order or play a random one. + var curSound:Int = -1; + + override function modify(index:Int, lineIndex:Int, renderData:AlphabetRenderData):Void { + if (effectTime < interval * index) { + renderData.alpha = 0.0; + return; + } + + if (index > lastIndex && sounds.length > 0) { + lastIndex = index; + curSound = (randomSound) ? FlxG.random.int(0, sounds.length - 1) : (curSound + 1) % sounds.length; + sounds[curSound].time = 0; + sounds[curSound].play(); + } + + var scale = Math.min((effectTime - interval * index) / interval, 1.0); + renderData.alpha *= FlxMath.lerp(alphaStart, 1.0, alphaEase(scale)); + renderData.offsetY += offsetStart * (1.0 - offsetEase(scale)); + } + + public function addSound(path:String) { + sounds.push(FlxG.sound.load(Paths.sound(path))); + } + + public function clearSounds() { + sounds.splice(0, sounds.length); + } + + public function resetTimer() { + // mainly for sound playing. + effectTime = 0; + lastIndex = -1; + curSound = -1; + } +} \ No newline at end of file