From 86c7207f65feb6092a3d48409ddf893d7984fbd2 Mon Sep 17 00:00:00 2001 From: Ne_Eo Date: Fri, 21 Jun 2024 21:52:28 +0200 Subject: [PATCH] Small cleanup and fixes --- source/funkin/menus/ui/NewAlphabet.hx | 185 ++++++++++++++++++-------- 1 file changed, 131 insertions(+), 54 deletions(-) diff --git a/source/funkin/menus/ui/NewAlphabet.hx b/source/funkin/menus/ui/NewAlphabet.hx index d3b5a73b..405b7e04 100644 --- a/source/funkin/menus/ui/NewAlphabet.hx +++ b/source/funkin/menus/ui/NewAlphabet.hx @@ -1,39 +1,69 @@ package funkin.menus.ui; +import flixel.util.FlxDirectionFlags; +import flixel.math.FlxPoint; import haxe.xml.Access; using StringTools; -enum abstract AlphabetAlignment(String) from String to String { - var LEFT = "left"; - var CENTER = "center"; - var RIGHT = "right"; +enum abstract AlphabetAlignment(Int) from Int to Int { + var LEFT; + var CENTER; + var RIGHT; - public function getMultiplier():Float { - return switch(this) { - case CENTER: 0.5; - case RIGHT: 1.0; + public function getMultiplier():Float { + return switch(this) { + case CENTER: 0.5; + case RIGHT: 1.0; default: 0.0; - } - } + } + } + + @:from + public static function fromString(value:String):AlphabetAlignment + return switch(value) { + case "left": LEFT; + case "center": CENTER; + case "right": RIGHT; + default: LEFT; + } +} + +enum abstract CaseMode(Int) from Int to Int { + var NONE; + var UPPER; + var LOWER; + + @:from + public static function fromString(value:String):CaseMode + return switch(value) { + case "none": NONE; + case "upper": UPPER; + case "lower": LOWER; + default: NONE; + } } class NewAlphabet extends FlxSprite { public var text(default, set):String = ""; @:isVar public var textWidth(get, set):Float; public var textHeight(get, null):Float; + public var alignment:AlphabetAlignment = LEFT; + public var forceCase:CaseMode = NONE; + var __laneWidths:Array = []; // TODO: add alignment. - var __forceWidth:Float = 0; // TODO: implement functionality for this. + var __forceWidth:Float = 0.0; // TODO: implement functionality for this. var __queueResize:Bool = false; - var __animTime:Float = 0; + var __animTime:Float = 0.0; var __ogForceScreen:Bool = false; + public var originOffset:FlxPoint = FlxPoint.get(); + public var font(default, set):String; - var defaultAdvance:Float = 40; - var forceCase:String = "none"; - var lineGap:Float = 75; - var fps:Int = 24; + var defaultAdvance:Float = 40.0; + var lineGap:Float = 75.0; + var fps:Float = 24.0; var defaults:Map = []; var anims:Map = []; var failedLetters:Array = []; @@ -44,6 +74,28 @@ class NewAlphabet extends FlxSprite { this.font = font; } + override function update(elapsed:Float) { + //super.update(elapsed); + // FLXOBJECT UPDATE + #if FLX_DEBUG + @:privateAccess FlxBasic.activeCount += 1; + #end + + last.set(x, y); + + if (path != null && path.active) + path.update(elapsed); + + if (moves) + updateMotion(elapsed); + + wasTouching = touching; + touching = FlxDirectionFlags.NONE; + // FLXOBJECT UPDATE END + + __animTime += elapsed; + } + override function draw() { __ogForceScreen = forceIsOnScreen; forceIsOnScreen = true; @@ -57,23 +109,26 @@ class NewAlphabet extends FlxSprite { override function drawComplex(camera:FlxCamera) { forceIsOnScreen = __ogForceScreen; - __animTime += FlxG.elapsed; + if (__queueResize) + recalcSizes(); var curLine = 0; var daText = switch (forceCase) { - case "upper": text.toUpperCase(); - case "lower": text.toLowerCase(); - default: text; + case UPPER: text.toUpperCase(); + case LOWER: text.toLowerCase(); + case NONE: text; } + var alignmentMultiplier = alignment.getMultiplier(); + var ogOffX = frameOffset.x; var ogOffY = frameOffset.y; - frameOffset.x -= (textWidth - __laneWidths[0]) * alignment.getMultiplier(); + frameOffset.x -= (textWidth - __laneWidths[0]) * alignmentMultiplier; for (i in 0...daText.length) { var letter = daText.charAt(i); if (letter == "\n") { curLine++; - frameOffset.x = ogOffX - (textWidth - __laneWidths[curLine]) * alignment.getMultiplier(); + frameOffset.x = ogOffX - (textWidth - __laneWidths[curLine]) * alignmentMultiplier; frameOffset.y -= lineGap; continue; } @@ -108,16 +163,16 @@ class NewAlphabet extends FlxSprite { width = Math.abs(scale.x) * textWidth; height = Math.abs(scale.y) * textHeight; offset.set(-0.5 * (width - textWidth), -0.5 * (height - textHeight)); - origin.set(textWidth * 0.5, textHeight * 0.5); + origin.set(textWidth * 0.5 + originOffset.x, textHeight * 0.5 + originOffset.y); } function recalcSizes():Void { __queueResize = false; var curLine = 0; var daText = switch (forceCase) { - case "upper": text.toUpperCase(); - case "lower": text.toLowerCase(); - default: text; + case UPPER: text.toUpperCase(); + case LOWER: text.toLowerCase(); + case NONE: text; } @:bypassAccessor textWidth = 0; textHeight = lineGap; @@ -136,23 +191,33 @@ class NewAlphabet extends FlxSprite { @:bypassAccessor textWidth = Math.max(textWidth, __laneWidths[curLine]); } - origin.set(textWidth * 0.5, textHeight * 0.5); + origin.set(textWidth * 0.5 + originOffset.x, textHeight * 0.5 + originOffset.y); } function getLetterAnim(char:String) { if (failedLetters.contains(char)) return null; - else if (animation.exists(char)) return animation.getByName(char); + if (animation.exists(char)) return animation.getByName(char); var charCode:Int = char.charCodeAt(0); - var anim:String = defaults.get("").replace("LETTER", char); - if (charCode >= 65 && charCode <= 90 && defaults.exists("UPPER")) - anim = defaults.get("UPPER").replace("LETTER", char); - else if (charCode >= 97 && charCode <= 122 && defaults.exists("LOWER")) - anim = defaults.get("LOWER").replace("LETTER", char); + var anim:String = null; if (anims.exists(char)) anim = anims.get(char); + if (anim == null) { + if (charCode >= 'A'.code && charCode <= 'A'.code && defaults.exists("UPPER")) + anim = defaults.get("UPPER").replace("LETTER", char); + else if (charCode >= 'a'.code && charCode <= 'z'.code && defaults.exists("LOWER")) + anim = defaults.get("LOWER").replace("LETTER", char); + else + anim = defaults.get("").replace("LETTER", char); + } + + if(anim == null) { + failedLetters.push(char); + return null; + } + animation.addByPrefix(char, anim, fps); if (!animation.exists(char)) { failedLetters.push(char); @@ -161,13 +226,41 @@ class NewAlphabet extends FlxSprite { return animation.getByName(char); } + function loadFont(value:String) { + __queueResize = true; + var xml:Xml = Xml.parse(Assets.getText(Paths.xml("alphabet/" + value))).firstElement(); + defaultAdvance = Std.parseFloat(xml.get("advance")).getDefault(40.0); + lineGap = Std.parseFloat(xml.get("lineGap")).getDefault(75.0); + fps = Std.parseFloat(xml.get("fps")).getDefault(24.0); + forceCase = xml.get("forceCasing").getDefault("none").toLowerCase(); + 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": + anims.set(node.get("char"), node.firstChild().nodeValue); + if (node.exists("y")) + yOffset.set(node.get("char"), Std.parseFloat(node.get("y")).getDefault(0)); + } + } + } + + override function destroy() { + originOffset = FlxDestroyUtil.destroy(originOffset); + failedLetters = []; + super.destroy(); + } + function get_textWidth():Float { if (__queueResize) recalcSizes(); return textWidth; } function set_textWidth(value:Float):Float { - __queueResize = __queueResize || (__forceWidth != value); + if(!__queueResize) + __queueResize = __forceWidth != value; return __forceWidth = value; } @@ -178,31 +271,15 @@ class NewAlphabet extends FlxSprite { } function set_text(value:String):String { - __queueResize = __queueResize || (text != value); + if(!__queueResize) + __queueResize = text != value; return text = value; } function set_font(value:String):String { if (font != value) { - __queueResize = true; - var xml:Xml = Xml.parse(openfl.Assets.getText(Paths.xml("alphabet/" + value))).firstElement(); - defaultAdvance = Std.parseFloat(xml.get("advance")).getDefault(40); - lineGap = Std.parseFloat(xml.get("lineGap")).getDefault(75); - fps = Std.parseInt(xml.get("fps")).getDefault(24); - forceCase = xml.get("forceCasing").getDefault("none").toLowerCase(); - 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": - anims.set(node.get("char"), node.firstChild().nodeValue); - if (node.exists("y")) - yOffset.set(node.get("char"), Std.parseFloat(node.get("y")).getDefault(0)); - } - } + loadFont(font = value); } - return font = value; + return value; } } \ No newline at end of file