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