language specific data and TypeEffect!
This commit is contained in:
@@ -17,6 +17,7 @@
|
|||||||
<anim char=".">period</anim>
|
<anim char=".">period</anim>
|
||||||
<anim char="?">question mark</anim>
|
<anim char="?">question mark</anim>
|
||||||
<anim char=""" y="22">start parentheses</anim>
|
<anim char=""" 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>
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user