language specific data and TypeEffect!

This commit is contained in:
SrtHero278
2024-09-08 17:42:14 -07:00
parent 34d205564c
commit d9ac738a61
7 changed files with 107 additions and 72 deletions
+1
View File
@@ -17,6 +17,7 @@
<anim char=".">period</anim> <anim char=".">period</anim>
<anim char="?">question mark</anim> <anim char="?">question mark</anim>
<anim char="&#34;" y="22">start parentheses</anim> <anim char="&#34;" y="22">start parentheses</anim>
<anim char="-" y="15">-</anim>
<anim char="^" y="28">^</anim> <anim char="^" y="28">^</anim>
<anim char="~" y="17">~</anim> <anim char="~" y="17">~</anim>
<anim char="=" y="13">=</anim> <anim char="=" y="13">=</anim>
-3
View File
@@ -153,9 +153,6 @@
<!-- Comment this out to disable dark mode windows --> <!-- Comment this out to disable dark mode windows -->
<define name="DARK_MODE_WINDOW"/> <define name="DARK_MODE_WINDOW"/>
<!-- Temporary define. Remove all instances of alphabet testing when finished. -->
<!-- <define name="ALPHABET_TESTING"/> -->
<haxedef name="VIDEO_CUTSCENES" if="VIDEO_CUTSCENES" /> <haxedef name="VIDEO_CUTSCENES" if="VIDEO_CUTSCENES" />
<haxedef name="UPDATE_CHECKING" if="UPDATE_CHECKING" /> <haxedef name="UPDATE_CHECKING" if="UPDATE_CHECKING" />
<haxedef name="DISCORD_RPC" if="DISCORD_RPC" /> <haxedef name="DISCORD_RPC" if="DISCORD_RPC" />
@@ -61,16 +61,12 @@ class MainState extends FlxState {
EventsData.reloadEvents(); EventsData.reloadEvents();
TitleState.initialized = false; TitleState.initialized = false;
#if (ALPHABET_TESTING)
FlxG.switchState(new funkin.menus.ui.NewAlphabetTest());
#else
if (betaWarningShown) if (betaWarningShown)
FlxG.switchState(new TitleState()); FlxG.switchState(new TitleState());
else { else {
FlxG.switchState(new BetaWarningState()); FlxG.switchState(new BetaWarningState());
betaWarningShown = true; betaWarningShown = true;
} }
#end
CoolUtil.safeAddAttributes('./.temp/', NativeAPI.FileAttribute.HIDDEN); CoolUtil.safeAddAttributes('./.temp/', NativeAPI.FileAttribute.HIDDEN);
} }
+46 -31
View File
@@ -144,9 +144,10 @@ class NewAlphabet extends FlxSprite {
var ogRed:Float = colorTransform.redMultiplier; var ogRed:Float = colorTransform.redMultiplier;
var ogGreen:Float = colorTransform.greenMultiplier; var ogGreen:Float = colorTransform.greenMultiplier;
var ogBlue:Float = colorTransform.blueMultiplier; var ogBlue:Float = colorTransform.blueMultiplier;
var ogAlpha:Float = colorTransform.alphaMultiplier;
for (i in 0...daText.length) { 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) { for (effect in effects) {
if (effect.willModify(i, i - lastLine, __renderData)) if (effect.willModify(i, i - lastLine, __renderData))
effect.modify(i, i - lastLine, __renderData); effect.modify(i, i - lastLine, __renderData);
@@ -164,7 +165,7 @@ class NewAlphabet extends FlxSprite {
var anim = getLetterAnim(letter); var anim = getLetterAnim(letter);
var advance:Float = getAdvance(letter, anim); var advance:Float = getAdvance(letter, anim);
if (anim == null) { if (anim == null || __renderData.alpha <= 0.0) {
frameOffset.x -= advance; frameOffset.x -= advance;
} else { } else {
var frameToGet = Math.floor(__animTime * fps) % anim.numFrames; 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); shader.setCamSize(_frame.frame.x, _frame.frame.y, _frame.frame.width, _frame.frame.height);
setColorTransform( 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 Math.round(__renderData.red * offsetMult), Math.round(__renderData.green * offsetMult), Math.round(__renderData.blue * offsetMult), 0
); );
super.drawComplex(camera); super.drawComplex(camera);
@@ -192,11 +193,9 @@ class NewAlphabet extends FlxSprite {
frameOffset.x -= offsetX; frameOffset.x -= offsetX;
frameOffset.x -= advance; 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); frameOffset.set(ogOffX, ogOffY);
} }
@@ -279,6 +278,42 @@ class NewAlphabet extends FlxSprite {
return animation.getByName(char); 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("<NORMAL>").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) { function loadFont(value:String) {
__queueResize = true; __queueResize = true;
@@ -298,30 +333,10 @@ class NewAlphabet extends FlxSprite {
forceCase = xml.get("forceCasing").getDefault("none").toLowerCase(); forceCase = xml.get("forceCasing").getDefault("none").toLowerCase();
transformMult = (xml.get("useColorOffsets") == "true") ? 0 : 1; transformMult = (xml.get("useColorOffsets") == "true") ? 0 : 1;
for (node in xml.elements()) { frames = null;
switch (node.nodeName) {
case "spritesheet": for (node in xml.elements())
frames = Paths.getFrames(node.firstChild().nodeValue); checkNode(node);
case "defaultAnim":
defaults.set(node.get("casing").getDefault("<NORMAL>").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);
}
}
}
} }
override function destroy() { override function destroy() {
-30
View File
@@ -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
@@ -11,17 +11,21 @@ class AlphabetRenderData {
public var red:Float = 0; public var red:Float = 0;
public var green:Float = 0; public var green:Float = 0;
public var blue:Float = 0; public var blue:Float = 0;
public var alpha:Float = 1;
public function new(parent:NewAlphabet) { public function new(parent:NewAlphabet) {
this.parent = parent; 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.parent = parent;
this.letter = letter; this.letter = letter;
offsetX = 0; this.offsetX = 0;
offsetY = 0; this.offsetY = 0;
color = 0xFFFFFFFF; this.red = red;
this.green = green;
this.blue = blue;
this.alpha = alpha;
} }
function get_color():FlxColor { function get_color():FlxColor {
@@ -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<flixel.sound.FlxSound> = [];
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;
}
}