diff --git a/assets/data/alphabet/bold.xml b/assets/data/alphabet/bold.xml index 5be5fa4b..da24f577 100644 --- a/assets/data/alphabet/bold.xml +++ b/assets/data/alphabet/bold.xml @@ -46,4 +46,11 @@ character-seven character-eight character-nine + + + + + + + \ No newline at end of file diff --git a/source/funkin/editors/alphabet/AlphabetEditor.hx b/source/funkin/editors/alphabet/AlphabetEditor.hx index f7138910..dd41c8dd 100644 --- a/source/funkin/editors/alphabet/AlphabetEditor.hx +++ b/source/funkin/editors/alphabet/AlphabetEditor.hx @@ -109,14 +109,19 @@ class AlphabetEditor extends UIState { ] }, { - label: "Move Tape Left", - keybind: [LEFT], - onSelect: _tape_left - }, - { - label: "Move Tape Right", - keybind: [RIGHT], - onSelect: _tape_right + label: "Tape", + childs: [ + { + label: "Move Tape Left", + keybind: [LEFT], + onSelect: _tape_left + }, + { + label: "Move Tape Right", + keybind: [RIGHT], + onSelect: _tape_right + } + ] } ]; @@ -163,6 +168,7 @@ class AlphabetEditor extends UIState { allChars.push(letter); } + // todo get other characters trace(allChars.join(" ")); @@ -302,7 +308,7 @@ class AlphabetEditor extends UIState { */ -class ComponentInfoWindow extends UIButtonList { +/*class ComponentInfoWindow extends UIButtonList { public function new(x:Float, y:Float) { super(x, y, ) } @@ -316,7 +322,7 @@ class ComponentButton extends UIButton { }); this.component = component; } -} +}*/ class GlyphInfoWindow extends UIWindow { public var info:UIText; diff --git a/source/funkin/menus/ui/Alphabet.hx b/source/funkin/menus/ui/Alphabet.hx index 495fe8f9..12c3fac8 100644 --- a/source/funkin/menus/ui/Alphabet.hx +++ b/source/funkin/menus/ui/Alphabet.hx @@ -15,6 +15,12 @@ import haxe.xml.Access; using StringTools; using flixel.util.FlxColorTransformUtil; +@:structInit +final class AlphabetOutline { + public var anim:String; + public var x:Float; + public var y:Float; +} @:structInit final class AlphabetComponent { public var anim:String; @@ -31,6 +37,8 @@ final class AlphabetComponent { public var hasColorMode:Bool; public var colorMode:ColorMode; + + @:optional public var outline:Null; } @:structInit @@ -109,6 +117,7 @@ class Alphabet extends FlxSprite { public var effects:Array = []; var __renderData:AlphabetRenderData; var __component:AlphabetComponent; + var __outline:AlphabetOutline; public var text(default, set):String = ""; @:isVar public var textWidth(get, set):Float; @@ -146,6 +155,7 @@ class Alphabet extends FlxSprite { v; }; var failedLetters:Array = []; + var failedOutlines:Array = []; public var renderMode:AlphabetRenderMode = DEFAULT; @@ -264,10 +274,10 @@ class Alphabet extends FlxSprite { break; // shouldnt this be like continue? var frameToGet = frameTime % anim.numFrames; - frame = frames.frames[anim.frames[frameToGet]]; + var fillFrame = frames.frames[anim.frames[frameToGet]]; var offsetX = __component.x + __renderData.offsetX; - var offsetY = frame.sourceSize.y - lineGap + __component.y + __renderData.offsetY; + var offsetY = fillFrame.sourceSize.y - lineGap + __component.y + __renderData.offsetY; if (isMonospace) offsetX -= (defaultAdvance - advance) * 0.5; frameOffset.x += offsetX; @@ -277,15 +287,39 @@ class Alphabet extends FlxSprite { frameOffset.x -= offsetX; break; } - if (isGraphicsShader) - shader.setCamSize(_frame.frame.x, _frame.frame.y, _frame.frame.width, _frame.frame.height); if (__component.hasColorMode) __component.colorMode.setColorTransform(colorTransform, __renderData.red, __renderData.green, __renderData.blue, __renderData.alpha); else colorMode.setColorTransform(colorTransform, __renderData.red, __renderData.green, __renderData.blue, __renderData.alpha); + if (__component.outline != null) { + __outline = __component.outline; + var outlineAnim = getLetterOutline(letter, __component, i); + if (outlineAnim != null) { + var frameToGet = frameTime % outlineAnim.numFrames; + frame = frames.frames[outlineAnim.frames[frameToGet]]; + + var offfx = (fillFrame.sourceSize.x - frame.sourceSize.x) * __component.scaleX + __outline.x; + var offfy = (fillFrame.sourceSize.y - frame.sourceSize.y) * __component.scaleY + __outline.y; + + frameOffset.x += offfx; + frameOffset.y += offfy; + + if (isGraphicsShader) + shader.setCamSize(_frame.frame.x, _frame.frame.y, _frame.frame.width, _frame.frame.height); + + drawLetter(camera); + frameOffset.x -= offfx; + frameOffset.y -= offfy; + } + } + + frame = fillFrame; + if (isGraphicsShader) + shader.setCamSize(_frame.frame.x, _frame.frame.y, _frame.frame.width, _frame.frame.height); drawLetter(camera); + frameOffset.y -= offsetY; frameOffset.x -= offsetX; } @@ -302,7 +336,8 @@ class Alphabet extends FlxSprite { _matrix.translate(_frame.frame.width * -0.5, _frame.frame.height * -0.5); _matrix.scale(__component.scaleX, __component.scaleY); - if(__component.shouldRotate) _matrix.rotateWithTrig(__component.cos, __component.sin); + if(__component.shouldRotate) + _matrix.rotateWithTrig(__component.cos, __component.sin); _matrix.translate(_frame.frame.width * 0.5, _frame.frame.height * 0.5); _matrix.translate(-origin.x, -origin.y); @@ -460,6 +495,19 @@ class Alphabet extends FlxSprite { return animation.getByName(name); } + function getLetterOutline(char:String, component:AlphabetComponent, index:Int) { + var name = char + "Outline" + Std.string(index); + if (failedOutlines.contains(name)) return null; + if (animation.exists(name)) return animation.getByName(name); + + animation.addByPrefix(name, component.outline.anim, fps); + if (!animation.exists(name)) { + failedOutlines.push(name); + return null; + } + return animation.getByName(name); + } + function checkNode(node:Xml):Void { switch (node.nodeName) { case "spritesheet": @@ -524,6 +572,15 @@ class Alphabet extends FlxSprite { var colorMode = ["tint", "offsets", "none"].indexOf(component.get("colorMode")); + var outline:AlphabetOutline = null; + if (component.get("hasOutline") == "true") { + outline = { + anim: component.get("outline"), + x: Std.parseFloat(component.get("outlineX")).getDefaultFloat(0.0), + y: Std.parseFloat(component.get("outlineY")).getDefaultFloat(0.0) + } + } + components.push({ anim: component.get("anim"), @@ -538,7 +595,8 @@ class Alphabet extends FlxSprite { sin: angleSin, hasColorMode: colorMode >= 0, - colorMode: colorMode + colorMode: colorMode, + outline: outline }); } letterData.set(char, { @@ -565,6 +623,15 @@ class Alphabet extends FlxSprite { var colorMode = ["tint", "offsets", "none"].indexOf(node.get("colorMode")); + var outline:AlphabetOutline = null; + if (node.get("hasOutline") == "true") { + outline = { + anim: node.get("outline"), + x: Std.parseFloat(node.get("outlineX")).getDefaultFloat(0.0), + y: Std.parseFloat(node.get("outlineY")).getDefaultFloat(0.0) + } + } + letterData.set(char, { isDefault: false, advance: advance, @@ -583,7 +650,8 @@ class Alphabet extends FlxSprite { sin: angleSin, hasColorMode: colorMode >= 0, - colorMode: colorMode + colorMode: colorMode, + outline: outline }] }); case "languageSection": // used to only parse characters if a specific language is selected @@ -644,7 +712,7 @@ class Alphabet extends FlxSprite { xml.set("fps", Std.string(fps)); xml.set("advance", Std.string(defaultAdvance)); xml.set("lineGap", Std.string(lineGap)); - xml.set("forceCasing", forceCase); + //xml.set("forceCasing", forceCase); xml.set("useColorOffsets", colorMode == OFFSET ? "true" : "false"); xml.set("antialiasing", antialiasing ? "true" : "false");