diff --git a/assets/data/config/menuItems.txt b/assets/data/config/menuItems.txt
index 1c59f5b1c..6fc72f135 100644
--- a/assets/data/config/menuItems.txt
+++ b/assets/data/config/menuItems.txt
@@ -1,5 +1,4 @@
story mode
-visual novel
freeplay
options
donate
\ No newline at end of file
diff --git a/assets/fonts/fnf.ttf b/assets/fonts/fnf.ttf
deleted file mode 100644
index a3abd44bd..000000000
Binary files a/assets/fonts/fnf.ttf and /dev/null differ
diff --git a/assets/images/menus/mainmenu/visual novel.png b/assets/images/menus/mainmenu/visual novel.png
deleted file mode 100644
index e584ba203..000000000
Binary files a/assets/images/menus/mainmenu/visual novel.png and /dev/null differ
diff --git a/assets/images/menus/mainmenu/visual novel.xml b/assets/images/menus/mainmenu/visual novel.xml
deleted file mode 100644
index 6211bbc0a..000000000
--- a/assets/images/menus/mainmenu/visual novel.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/assets/images/menus/titlescreen/titleEnter.png b/assets/images/menus/titlescreen/titleEnter.png
index 87d2e8c55..38d6fab9b 100644
Binary files a/assets/images/menus/titlescreen/titleEnter.png and b/assets/images/menus/titlescreen/titleEnter.png differ
diff --git a/assets/images/menus/titlescreen/titleEnter.xml b/assets/images/menus/titlescreen/titleEnter.xml
index 781d662d6..7aaf5458a 100644
--- a/assets/images/menus/titlescreen/titleEnter.xml
+++ b/assets/images/menus/titlescreen/titleEnter.xml
@@ -1,60 +1,61 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/assets/images/vn/bgs/school.png b/assets/images/vn/bgs/school.png
deleted file mode 100644
index aa4992358..000000000
Binary files a/assets/images/vn/bgs/school.png and /dev/null differ
diff --git a/assets/images/vn/box.png b/assets/images/vn/box.png
deleted file mode 100644
index 5b02b55e3..000000000
Binary files a/assets/images/vn/box.png and /dev/null differ
diff --git a/assets/images/vn/options.png b/assets/images/vn/options.png
deleted file mode 100644
index bc33d2931..000000000
Binary files a/assets/images/vn/options.png and /dev/null differ
diff --git a/assets/images/vn/options_selected.png b/assets/images/vn/options_selected.png
deleted file mode 100644
index 3d2f88ca2..000000000
Binary files a/assets/images/vn/options_selected.png and /dev/null differ
diff --git a/assets/images/vn/portraits/cody.png b/assets/images/vn/portraits/cody.png
deleted file mode 100644
index c277489e2..000000000
Binary files a/assets/images/vn/portraits/cody.png and /dev/null differ
diff --git a/assets/images/vn/portraits/kiss.png b/assets/images/vn/portraits/kiss.png
deleted file mode 100644
index 24249dc43..000000000
Binary files a/assets/images/vn/portraits/kiss.png and /dev/null differ
diff --git a/assets/images/vn/portraits/pessy.png b/assets/images/vn/portraits/pessy.png
deleted file mode 100644
index e88095ead..000000000
Binary files a/assets/images/vn/portraits/pessy.png and /dev/null differ
diff --git a/assets/images/vn/senpaimusic.ogg b/assets/images/vn/senpaimusic.ogg
deleted file mode 100644
index ec8b5d61b..000000000
Binary files a/assets/images/vn/senpaimusic.ogg and /dev/null differ
diff --git a/assets/images/vn/sound_13.wav b/assets/images/vn/sound_13.wav
deleted file mode 100644
index f16be7040..000000000
Binary files a/assets/images/vn/sound_13.wav and /dev/null differ
diff --git a/assets/images/vn/vn.xml b/assets/images/vn/vn.xml
deleted file mode 100644
index 6f05017d5..000000000
--- a/assets/images/vn/vn.xml
+++ /dev/null
@@ -1,556 +0,0 @@
-
-
-
-
- Pessy
- pessy
- 1
- 653BA9
- left
-
-
-
- Cody
- cody
- 1
- A36BCC
- right
-
-
-
- Pessy & Cody
- kiss
- 1
- 7c4cb6
- center
- 0,50
-
-
-
-
- The day starts of as usual, with Cody and Pessy meeting each other whilst on the way to school
-
-
-
- Hey Cody! How are you doing?
-
-
-
- Hey Pessy, I'm doing well!
-
-
-
- Did you sleep well Cody?
- Yes i did
- No i didn't
-
-
-
- I slept well, I dreamt about all the possibilities of what Friday Night Funkin' could include in their next update!
-
-
-
- I imagine what the lemon demon songs for the erect difficulty would sound like!
-
-
-
-
- Oh yeah!! I bet it's gonna sound really creepy but also good!
-
-
-
- I bet. The voice actor for him is really good at it!
-
-
-
- I had a horrible nightmare, I dreamt of Friday Night Funkin' getting canceled.
-
-
-
- It was due to the developers being exposed of spending all the kickstarter money on crack. A team member who is against this posted a google doc of the situation on twitter.
-
-
-
- Oh man that must have been a really bad nightmare. At least they are now showing teasers online like that erect sampler they showed the other day!
-
-
-
- Yeah, I'm really glad that they are now finally doing that after almost 3 years of nothing. The FNF mods were really making this community alive.
-
-
-
-talk about current mods, where each engine talking about each others engines mods and how cool they are
-
-
- Have you heard about the mod…
-
- Talk about: Impostor V4
- Talk about: Hotline 024
- Talk about: Mario's Madness
- Talk about: 17 Bucks
-
-
-
- Vs Impostor?
-
-
-
- Yea i heard about that! I find it very sus! Ha.
-
-
-
- But actually it's a really good mod. I like how Maroon's parasite form looks! It really fits for his song.
-
-
-
- Yeah me too!! My favorite part from Vs Impostor is Finale. That song is so good I love it to death!!!
-
-
-
- I don't blame you! That's the best song from the mod tbh.
-
-
-
- Have you heard about Sunday's Desolation?
-
-
-
- Oh yeah I did! That's such a good mod. It's really high quality for a fanmade mod about Wednesday's Infidelity!
-
-
-
- Yeah, it even has one of your developers for your engine on the team. That's really awesome!!
-
-
-
- I think that's really cool actually. I like that this mod is all about Oswald from the original mod. Really cool that the team is making a whole mod about him!
-
-
-—-
-
-
- Hotline 024?
-
-
-
- Yea i heard about that! I really like Nikku's character design, and how she can mimic other voices!
-
-
-
- Yeah!! There's even a whole tricky-themed song in the mod, and even Nikku is mimicking Tricky's voice at certain parts!!
-
-
-
- Kinda sucks that the original tricky mod was made on Kade Engine, Kevin is just really too much of a hardcoding guy and he is really unoptimized. I don't like talking to him that much.
-
-
-
- I do see him hanging out with the other engines. But lately his popularity has kinda stopped.
-
-
-
- Yeah… I do admit he's the reason why people started modding FNF though, he's the one that started FNF modding!
-
-
-
- I agree… He actually makes me feel nostalgic of the early era of FNF modding…
-
-
-
- Have you seen Cyber Sensation recently?
-
-
-
- I did actually! Unfortunate that it got canceled though…
-
-
-
- Yeah… the creator had to leave the community. Got exhausted from the game.
-
-
-
- I don't blame her. FNF does get really tiring after a good while.
-
-
-—---
-
-
- Mario's Madness?
-
-
-
- Yeah! That's one of the trending mods right now! I like how All-Stars play out. It's such a sad but awesome ending!
-
-
-
- I agree!! Some people are mad about it, but to be honest BF wins too much. He had to lose at some point.
-
-
-
- True. Sometimes all good things must come to an end.
-
-
-
- heyy mmv2 reference!! That's from the dialogue when mario sees bf again before All-Stars happens lol!!
-
-
-
- omg LMAO cody you're so funny!!!
-
-
-
- They laughed for a solid 5 minutes.
-
-
-
- haha….. Anyways, did you hear about Gorefield getting a big update?
-
-
-
- Yeah I did!! V2 is such a huge improvement from V1 it's insane.
-
-
-
- Yeah!! I like how Cataclysm goes… It's pretty similar to All-Stars
-
-
-
- It's a really awesome song to be honest!! Such an awesome ending to the mod. I like that there are flashbacks of the previous songs played and that they are being controlled by Godfield.
-
-
-
- Again, it's like how All-Stars play out! Like how Ultra M is controlling the past enemies the player faced against at Act 4.
-
-
-
- I really like that mods do that.
-
-
-—---
-
-
-
- 17 Bucks?
-
-
-
- Yeah I have! The charm of it is actually so amazing.
-
-
-
- I agree, my favorite song from the mod is Kevinteenbucks.
-
-
-
- Cool! Mine is Fitin'. The song loops forever but to be honest that's really funny to me!
-
-
-
- I think that's funny too! That's actually my first time seeing a mod do that when I first played it.
-
-
-
- Yeah, it's pretty awesome! Pretty cool how people in this community can code such cool things.
-
-
-
- Have you heard about YTP Invasion?
-
-
-
- Yeah!! It's not out yet, but it's going to really soon!
-
-
-
- Yup.. I think it's gonna drop this month actually!
-
-
-
- Whaaat, really??
-
-
-
- Yes, they announced that sometime ago on their twitter account! They released a trailer about it and everyone got super hyped about it!!
-
-
-
- Woahhh… cool!! What is it all about?
-
-
-
- Well basically, it's a mod about iconic Youtube Poop (YTP for short) characters rap battling against boyfriend.
-
-
-
- Sounds cool! I think that's gonna be a really awesome mod everyone will love.
-
-
-—---
-
-
-talk about some stuff that's been happening with the base game
-
-
- Did you see that new FNF blog that recently got released? It shows the new chart editor that's with the base game!
-
-
-
- I saw!!! It looked really cool. I saw it looked inspired by your editor.
-
-
-
- I know! It feels inspired by yours too!
-
-
-
- Yeah! I rembeber adding waveforms way back! Also they added your note selection and dragging!
-
-
-
- That just makes me really happy. Even though I'm not that much of a popular engine, the FNF developers still might have taken some inpriation from me. Which is awesome considering they defenitely took some from you!
-
-
-
- That shows they take advice from FNF modders and FNF engine developers! They care about the community.
-
-
-
- That may be true because they also updated their erect songs after dropping the erect sampler!
-
-
-
- They did? Wow! That's actually really awesome. What songs did they change?
-
-
-
- So far we only know Fresh and Pico. They dropped the updated versions on their Tiktok account.
-
-
-
- Oh cool! I didn't really like how BF sounded in Pico. His vocals were kinda just all over the place.
-
-
-
- Yeah they actually changed that! His vocals became less intense and are actually more calm now.
-
-
-
- That's awesome. I really can't wait for the update!
-
-
-—-
-
-small personal talk
-
-
- The both of them start thinking about their personal things. Both of them think they should share it to the other.
-
-
-
- I recently transitioned from alpha to beta state the other day.
-
-
-
- Oh really? That's great news! Good job on making progress on your engine!
-
-
-
- Thank you! I'm actually excited to release this engine at some point.
-
-
-
- I also heard that you started working on the final version of psych. That's pretty cool!
-
-
-
- I heard it's gonna have a stage editor! I'm really excited to see that!
-
-
-
- Yea and I'm also working on adding Language support, and a new chart editor.
-
-
-
- Oh awesome!! That's cool that you're finishing your engine. I can't wait for it to drop!
-
-
-
- They both went silent for a moment.
-
-
-—--
-
-talking about crushes
-
-
- I have a crush on this engine where you can softcode literally anything…
-
-
-
- R…really? Who is this engine you're talking about…?
-
-
-
- …Y-...you…
-
-
-
- …W-what? Oh my god… I think I'm blushing…!!
-
-
-
- …yeah…
-
-
-
- …well…
-
-
-
-
-
-
- I have a crush on an engine that is user-friendly and has lua scripting…
-
-
-
- …Cody…
-
-
-
- Pessy leans to Cody for a kiss.
-
- Kiss Pessy
- Reject the kiss
-
-
-
- Cody leans to Pessy to kiss her.
-
-
-
- *muwha* *sloppy kisses*
-
-
-
- *drools* *muwah muah*
-
-
-
- …that… was something.
-
-
-
- Cody… I love you.
-
-
-
- …I… love you too…
-
-
-
- …
-
-
-
- …
-
-
-
- Pessy looks at her clock. It seems they are running late for class!
-
-
-
-
- Cody backs up.
-
-
-
- Hey wait… I don't really wanna start this relationship yet.
-
-
-
- Oh… well that's alright. Do you wanna have a date sometime later then?
-
-
-
- Sure. I think we gotta develop our feelings for each other first before we take it to the next level.
-
-
-
- Pessy looks at her clock. It seems they are running late for class!
-
-
-
-
- …Pessy… I really don't want to hurt your feelings, but I don't feel the same way for you…
-
-
-
- Oh… well… I'm sorry for being weird there…
-
-
-
- It's ok Pessy… I think it's best if we just stay as friends.
-
-
-
- Alrighty… I'm ok with that.
-
-
-
- Pessy looks at her clock. It seems they are running late for class!
-
-
-—
-
-ending
-
-
- We should probably get to class now!
-
-
-
- It was really fun talking to you.
-
-
-
- Same here.
-
-
-
- Well I will see you sometime later, ok?
-
-
-
- Alrighty… Bye Cody!!
-
-
-
- Bye Pessy!
-
-
-Credits:
-
-
- Credits:
- Coding: Ne_Eo
- Music & Sfx: Bromaster819
- Writing: Syrup, Bromaster819, Ne_Eo, SlightlyCreative, swordcube
- Art: Mkv8
-
-
-
- Time spent writing this novel: 3h 19m
- Time since idea: 3h 57m
-
-
-
- Replay?
-
- Yes
- Exit
-
-
-
-
\ No newline at end of file
diff --git a/assets/shaders/engine/editorWaveforms.frag b/assets/shaders/engine/editorWaveforms.frag
index 7ac0df32b..c2ea827dc 100644
--- a/assets/shaders/engine/editorWaveforms.frag
+++ b/assets/shaders/engine/editorWaveforms.frag
@@ -2,11 +2,6 @@
// Used in charter by waveforms
-#define HEIGHT 0.05 // Height of the Bar
-#define BACKLIGHT 0.6 // Backlight
-#define BRIGHTNESS 0.33 // overall Brightness
-#define GLOW 1.25 // Glow intensity of the Bar
-
const vec3 gradient1 = vec3(114.0/255.0, 81.0/255.0, 135.0/255.0);
const vec3 gradient2 = vec3(144.0/255.0, 80.0/255.0, 186.0/255.0);
@@ -23,8 +18,6 @@ uniform ivec2 waveformSize;
uniform bool lowDetail;
-uniform float time;
-
float getAmplitude(vec2 pixel) {
float pixelID = floor((pixel.y+pixelOffset)/3.0);
@@ -59,7 +52,26 @@ void outlineWaveform(vec2 pixel, vec2 offset) {
float ampwidth = (1.0-amplitude) * textureRes.x;
if (!inWaveForm(pixel, ampwidth))
- gl_FragColor = vec4(vec3(0.), 1.);
+ gl_FragColor -= outlinecolor*mix(0.5, 0.8, amplitude);
+}
+
+void highDetailWaveform(vec2 pixel, float amplitude, float ampwidth) {
+ vec3 gradientColor = mix(gradient1, gradient2, openfl_TextureCoordv.x);
+ gradientColor *= pixel.y+pixelOffset>playerPosition ? 0.7 : 1.0;
+ gradientColor = mix(gradientColor, gradientColor * vec3(1.8), map(getHightlight(amplitude), 0.0, 1.0, 0.5, 1.0));
+
+ float ampwidthHighlight = getAmpWidth(amplitude/3.0);
+ if (inWaveForm(pixel, ampwidthHighlight))
+ gradientColor = mix(gradientColor, gradientColor * vec3(1.8), map(getHightlight(ampwidthHighlight), 0.0, 1.0, 0.5, 1.0));
+
+ gl_FragColor = vec4(vec3(gradientColor * mix(0.5, 0.8, amplitude))*openfl_Alphav, openfl_Alphav);
+
+ outlineWaveform(pixel, vec2(0.0, -1.0));
+ outlineWaveform(pixel, vec2(0.0, 1.0));
+}
+
+void lowDetailWaveform(vec2 pixel, float amplitude, float ampwidth) {
+ gl_FragColor = vec4(lowdetailcol * (pixel.y+pixelOffset>playerPosition ? 0.7 : 1.0), 1.0);
}
void main()
@@ -68,21 +80,9 @@ void main()
float amplitude = getAmplitude(pixel);
float ampwidth = getAmpWidth(amplitude);
- gl_FragColor = vec4(vec3(0.0), .1);
-
- vec2 uv = openfl_TextureCoordv.xy - 0.5;
-
- float c = BACKLIGHT;
- float a = abs(uv.x);
- float s = 1.0 - smoothstep(0.0, ampwidth/textureRes.x, a);
- c *= 1.33 - smoothstep(0.0, 0.5, a);
- c*=c*c;
- c += s*.5;
+ gl_FragColor = vec4(0.0);
+ if (!inWaveForm(pixel, ampwidth)) return;
- if (inWaveForm(pixel, ampwidth))
- c += s;
-
- gl_FragColor = vec4((cos(6.283 * (uv.y + time + vec3(0.0,.33,0.66)))*map(getHightlight(amplitude), 0.0, 1.0, 0.5, 1.0)) + GLOW, 1.0) * c * BRIGHTNESS;
- gl_FragColor.xyz *= map(getHightlight(amplitude), 0.0, 1.0, 0.5, 1.0);
- gl_FragColor.xyz *= pixel.y+pixelOffset>playerPosition ? 0.6 : 1.0;
+ if (lowDetail) lowDetailWaveform(pixel, amplitude, ampwidth);
+ else highDetailWaveform(pixel, amplitude, ampwidth);
}
\ No newline at end of file
diff --git a/source/flixel/text/FlxText.hx b/source/flixel/text/FlxText.hx
deleted file mode 100644
index 3e8505e36..000000000
--- a/source/flixel/text/FlxText.hx
+++ /dev/null
@@ -1,1293 +0,0 @@
-package flixel.text;
-
-import flixel.FlxG;
-import flixel.FlxSprite;
-import flixel.graphics.FlxGraphic;
-import flixel.graphics.atlas.FlxAtlas;
-import flixel.graphics.atlas.FlxNode;
-import flixel.graphics.frames.FlxFramesCollection;
-import flixel.math.FlxMath;
-import flixel.math.FlxPoint;
-import flixel.math.FlxRect;
-import flixel.system.FlxAssets;
-import flixel.util.FlxColor;
-import flixel.util.FlxDestroyUtil;
-import flixel.util.helpers.FlxRange;
-import openfl.Assets;
-import openfl.display.BitmapData;
-import openfl.geom.ColorTransform;
-import openfl.text.TextField;
-import openfl.text.TextFieldAutoSize;
-import openfl.text.TextFormat;
-import openfl.text.TextFormatAlign;
-
-using flixel.util.FlxStringUtil;
-using flixel.util.FlxUnicodeUtil;
-
-#if flash
-import openfl.geom.Rectangle;
-#end
-#if (openfl >= "8.0.0")
-import openfl.utils.AssetType;
-#end
-
-// TODO: think about filters and text
-
-/**
- * Extends FlxSprite to support rendering text. Can tint, fade, rotate and scale just like a sprite. Doesn't really animate
- * though. Also does nice pixel-perfect centering on pixel fonts as long as they are only one-liners.
- *
- * ## Autosizing
- *
- * By default `FlxText` is autosized to fit it's text.
- * To set a fixed size, use the `fieldWidth`, `fieldHeight` and `autoSize` fields.
- */
-class FlxText extends FlxSprite
-{
- /**
- * 4px gutter at the bottom when the field has automatic height
- */
- static inline var VERTICAL_GUTTER:Int = 4;
-
- /**
- * The text being displayed.
- */
- public var text(default, set):String = "";
-
- /**
- * The size of the text being displayed in pixels.
- */
- public var size(get, set):Int;
-
- /**
- * A number representing the amount of space that is uniformly distributed
- * between all characters. The value specifies the number of pixels that are
- * added to the advance after each character.
- */
- public var letterSpacing(get, set):Float;
-
- /**
- * The font used for this text (assuming that it's using embedded font).
- */
- public var font(get, set):String;
-
- /**
- * Whether this text field uses an embedded font (by default) or not.
- * Read-only - use `systemFont` to specify a system font to use, which then automatically sets this to `false`.
- */
- public var embedded(get, never):Bool;
-
- /**
- * The system font for this text (not embedded). Setting this sets `embedded` to `false`.
- * Passing an invalid font name (like `""` or `null`) causes a default font to be used.
- */
- public var systemFont(get, set):String;
-
- /**
- * Whether to use bold text or not (`false` by default).
- */
- public var bold(get, set):Bool;
-
- /**
- * Whether to use italic text or not (`false` by default). Only works on Flash.
- */
- public var italic(get, set):Bool;
-
- /**
- * Whether to use underlined text or not (`false` by default).
- */
- public var underline(get, set):Bool;
-
- /**
- * Whether to use word wrapping and multiline or not (`true` by default).
- */
- public var wordWrap(get, set):Bool;
-
- /**
- * The alignment of the font. Note: `autoSize` must be set to
- * `false` or `alignment` won't show any visual differences.
- */
- public var alignment(get, set):FlxTextAlign;
-
- /**
- * The border style to use
- */
- public var borderStyle(default, set):FlxTextBorderStyle = NONE;
-
- /**
- * The color of the border in `0xAARRGGBB` format
- */
- public var borderColor(default, set):FlxColor = FlxColor.TRANSPARENT;
-
- /**
- * The size of the border, in pixels.
- */
- public var borderSize(default, set):Float = 1;
-
- /**
- * How many iterations do use when drawing the border. `0`: only 1 iteration, `1`: one iteration for every pixel in `borderSize`
- * A value of `1` will have the best quality for large border sizes, but might reduce performance when changing text.
- * NOTE: If the `borderSize` is `1`, `borderQuality` of `0` or `1` will have the exact same effect (and performance).
- */
- public var borderQuality(default, set):Float = 1;
-
- /**
- * Reference to a `TextField` object used internally for rendering -
- * be sure to know what you're doing if messing with its properties!
- */
- public var textField(default, null):TextField;
-
- /**
- * The width of the `TextField` object used for bitmap generation for this `FlxText` object.
- * Use it when you want to change the visible width of text. Enables `autoSize` if `<= 0`.
- *
- * **NOTE:** auto width always implies auto height
- */
- public var fieldWidth(get, set):Float;
-
- /**
- * The height of `TextField` object used for bitmap generation for this `FlxText` object.
- * Use it when you want to change the visible height of the text. Enables "auto height" if `<= 0`.
- *
- * **NOTE:** Fixed height has no effect if `autoSize = true`.
- * @since 5.4.0
- */
- public var fieldHeight(get, set):Float;
-
- /**
- * Whether the `fieldWidth` and `fieldHeight` should be determined automatically.
- * Requires `wordWrap` to be `false`.
- */
- public var autoSize(get, set):Bool;
-
- var _autoHeight:Bool = true;
-
- /**
- * Offset that is applied to the shadow border style, if active.
- * `x` and `y` are multiplied by `borderSize`. Default is `(1, 1)`, or lower-right corner.
- */
- public var shadowOffset(default, null):FlxPoint;
-
- var _defaultFormat:TextFormat;
- var _formatAdjusted:TextFormat;
- var _formatRanges:Array = [];
- var _font:String;
-
- /**
- * Helper boolean which tells whether to update graphic of this text object or not.
- */
- var _regen:Bool = true;
-
- /**
- * Helper vars to draw border styles with transparency.
- */
- var _borderPixels:BitmapData;
-
- var _borderColorTransform:ColorTransform;
-
- var _hasBorderAlpha = false;
-
- #if flash
- /**
- * Helper to draw line by line used at `drawTextFieldTo()`.
- */
- var _textFieldRect:Rectangle = new Rectangle();
- #end
-
- /**
- * Creates a new `FlxText` object at the specified position.
- *
- * @param X The x position of the text.
- * @param Y The y position of the text.
- * @param FieldWidth The `width` of the text object. Enables `autoSize` if `<= 0`.
- * (`height` is determined automatically).
- * @param Text The actual text you would like to display initially.
- * @param Size The font size for this text object.
- * @param EmbeddedFont Whether this text field uses embedded fonts or not.
- */
- public function new(X:Float = 0, Y:Float = 0, FieldWidth:Float = 0, ?Text:String, Size:Int = 8, EmbeddedFont:Bool = true)
- {
- super(X, Y);
-
- if (Text == null || Text == "")
- {
- // empty texts have a textHeight of 0, need to
- // prevent initializing with "" before the first calcFrame() call
- text = "";
- Text = " ";
- }
- else
- {
- text = Text;
- }
-
- textField = new TextField();
- textField.selectable = false;
- textField.multiline = true;
- textField.wordWrap = true;
- _defaultFormat = new TextFormat(null, Size, 0xffffff);
- letterSpacing = 0;
- font = FlxAssets.FONT_DEFAULT;
- _formatAdjusted = new TextFormat();
- textField.defaultTextFormat = _defaultFormat;
- textField.text = Uwuifier.uwuifySentence(Text);
- fieldWidth = FieldWidth;
- textField.embedFonts = EmbeddedFont;
- textField.sharpness = 100;
- textField.height = (Text.length <= 0) ? 1 : 10;
-
- allowCollisions = NONE;
- moves = false;
-
- drawFrame();
-
- shadowOffset = FlxPoint.get(1, 1);
- }
-
- /**
- * Clean up memory.
- */
- override public function destroy():Void
- {
- textField = null;
- _font = null;
- _defaultFormat = null;
- _formatAdjusted = null;
- shadowOffset = FlxDestroyUtil.put(shadowOffset);
- super.destroy();
- }
-
- override public function drawFrame(Force:Bool = false):Void
- {
- _regen = _regen || Force;
- super.drawFrame(_regen);
- }
-
- /**
- * Stamps text onto specified atlas object and loads graphic from this atlas.
- * WARNING: Changing text after stamping it on the atlas will break the atlas, so do it only for
- * static texts and only after making all the text customizing (like `size`, `alignment`, `color`, etc.)
- *
- * @param atlas atlas to stamp graphic to.
- * @return whether the graphic was stamped on the atlas successfully
- */
- public function stampOnAtlas(atlas:FlxAtlas):Bool
- {
- regenGraphic();
-
- var node:FlxNode = atlas.addNode(graphic.bitmap, graphic.key);
- var result:Bool = (node != null);
-
- if (node != null)
- {
- frames = node.getImageFrame();
- }
-
- return result;
- }
-
- /**
- * Applies formats to text between marker characters, then removes those markers.
- * NOTE: this will clear all `FlxTextFormat`s and return to the default format.
- *
- * Usage:
- *
- * ```haxe
- * text.applyMarkup(
- * "show $green text$ between dollar-signs",
- * [new FlxTextFormatMarkerPair(greenFormat, "$")]
- * );
- * ```
- *
- * Even works for complex nested formats like this:
- *
- * ```haxe
- * var yellow = new FlxTextFormatMarkerPair(yellowFormat, "@");
- * var green = new FlxTextFormatMarkerPair(greenFormat, "");
- * text.applyMarkup("Hey @Buddy@, what is going @on?@", [yellow, green]);
- * ```
- *
- * @param input The text you want to format
- * @param rules `FlxTextFormat`s to selectively apply, paired with marker strings
- */
- public function applyMarkup(input:String, rules:Array):FlxText
- {
- if (rules == null || rules.length == 0)
- return this; // there's no point in running the big loop
-
- clearFormats(); // start with default formatting
-
- var rangeStarts:Array = [];
- var rangeEnds:Array = [];
- var rulesToApply:Array = [];
-
- var i:Int = 0;
- for (rule in rules)
- {
- if (rule.marker == null || rule.format == null)
- continue;
-
- var start:Bool = false;
- var markerLength:Int = rule.marker.uLength();
-
- if (!input.contains(rule.marker))
- continue; // marker not present
-
- // inspect each character
- for (charIndex in 0...input.uLength())
- {
- if (!input.uSub(charIndex, markerLength).uEquals(rule.marker))
- continue; // it's not one of the markers
-
- if (start)
- {
- start = false;
- rangeEnds.push(charIndex); // end a format block
- }
- else // we're outside of a format block
- {
- start = true; // start a format block
- rangeStarts.push(charIndex);
- rulesToApply.push(rule);
- }
- }
-
- if (start)
- {
- // we ended with an unclosed block, mark it as infinite
- rangeEnds.push(-1);
- }
-
- i++;
- }
-
- // Remove all of the markers in the string
- for (rule in rules)
- input = input.remove(rule.marker);
-
- // Adjust all the ranges to reflect the removed markers
- for (i in 0...rangeStarts.length)
- {
- // Consider each range start
- var delIndex:Int = rangeStarts[i];
- var markerLength:Int = rulesToApply[i].marker.uLength();
-
- // Any start or end index that is HIGHER than this must be subtracted by one markerLength
- for (j in 0...rangeStarts.length)
- {
- if (rangeStarts[j] > delIndex)
- {
- rangeStarts[j] -= markerLength;
- }
- if (rangeEnds[j] > delIndex)
- {
- rangeEnds[j] -= markerLength;
- }
- }
-
- // Consider each range end
- delIndex = rangeEnds[i];
-
- // Any start or end index that is HIGHER than this must be subtracted by one markerLength
- for (j in 0...rangeStarts.length)
- {
- if (rangeStarts[j] > delIndex)
- {
- rangeStarts[j] -= markerLength;
- }
- if (rangeEnds[j] > delIndex)
- {
- rangeEnds[j] -= markerLength;
- }
- }
- }
-
- // Apply the new text
- text = input;
-
- // Apply each format selectively to the given range
- for (i in 0...rangeStarts.length)
- addFormat(rulesToApply[i].format, rangeStarts[i], rangeEnds[i]);
-
- return this;
- }
-
- /**
- * Adds another format to this `FlxText`
- *
- * @param Format The format to be added.
- * @param Start The start index of the string where the format will be applied.
- * @param End The end index of the string where the format will be applied.
- */
- public function addFormat(Format:FlxTextFormat, Start:Int = -1, End:Int = -1):FlxText
- {
- _formatRanges.push(new FlxTextFormatRange(Format, Start, End));
- // sort the array using the start value of the format so we can skip formats that can't be applied to the textField
- _formatRanges.sort(function(left, right)
- {
- return left.range.start < right.range.start ? -1 : 1;
- });
- _regen = true;
-
- return this;
- }
-
- /**
- * Removes a specific `FlxTextFormat` from this text.
- * If a range is specified, this only removes the format when it touches that range.
- */
- public function removeFormat(Format:FlxTextFormat, ?Start:Int, ?End:Int):FlxText
- {
- var i = _formatRanges.length;
- while (i-- > 0)
- {
- var formatRange = _formatRanges[i];
- if (formatRange.format != Format)
- continue;
-
- if (Start != null && End != null)
- {
- var range = formatRange.range;
- if (Start >= range.end || End <= range.start)
- continue;
-
- if (Start > range.start && End < range.end)
- {
- addFormat(formatRange.format, End + 1, range.end);
- range.end = Start;
- continue;
- }
-
- if (Start <= range.start && End < range.end)
- {
- range.start = End;
- continue;
- }
-
- if (Start > range.start && End >= range.end)
- {
- range.end = Start;
- continue;
- }
- }
-
- _formatRanges.remove(formatRange);
- }
-
- _regen = true;
-
- return this;
- }
-
- /**
- * Clears all the formats applied.
- */
- public function clearFormats():FlxText
- {
- _formatRanges = [];
- updateDefaultFormat();
-
- return this;
- }
-
- /**
- * You can use this if you have a lot of text parameters to set instead of the individual properties.
- *
- * @param Font The name of the font face for the text display.
- * @param Size The size of the font (in pixels essentially).
- * @param Color The color of the text in `0xRRGGBB` format.
- * @param Alignment The desired alignment
- * @param BorderStyle Which border style to use
- * @param BorderColor Color for the border, `0xAARRGGBB` format
- * @param EmbeddedFont Whether this text field uses embedded fonts or not
- * @return This `FlxText` instance (nice for chaining stuff together, if you're into that).
- */
- public function setFormat(?Font:String, Size:Int = 8, Color:FlxColor = FlxColor.WHITE, ?Alignment:FlxTextAlign, ?BorderStyle:FlxTextBorderStyle,
- BorderColor:FlxColor = FlxColor.TRANSPARENT, EmbeddedFont:Bool = true):FlxText
- {
- BorderStyle = (BorderStyle == null) ? NONE : BorderStyle;
-
- if (EmbeddedFont)
- {
- font = Font;
- }
- else if (Font != null)
- {
- systemFont = Font;
- }
-
- size = Size;
- color = Color;
- if (Alignment != null)
- alignment = Alignment;
- setBorderStyle(BorderStyle, BorderColor);
-
- updateDefaultFormat();
-
- return this;
- }
-
- /**
- * Set border's style (shadow, outline, etc), color, and size all in one go!
- *
- * @param Style outline style
- * @param Color outline color in `0xAARRGGBB` format
- * @param Size outline size in pixels
- * @param Quality outline quality - # of iterations to use when drawing. `0`: just 1, `1`: equal number to `Size`
- */
- public inline function setBorderStyle(Style:FlxTextBorderStyle, Color:FlxColor = 0, Size:Float = 1, Quality:Float = 1):FlxText
- {
- borderStyle = Style;
- borderColor = Color;
- borderSize = Size;
- borderQuality = Quality;
-
- return this;
- }
-
- override function updateHitbox()
- {
- regenGraphic();
- super.updateHitbox();
- }
-
- override function getScreenBounds(?newRect:FlxRect, ?camera:FlxCamera):FlxRect
- {
- regenGraphic();
- return super.getScreenBounds(newRect, camera);
- }
-
- function set_fieldWidth(value:Float):Float
- {
- if (textField == null)
- return value;
-
- if (value <= 0)
- {
- wordWrap = false;
- autoSize = true;
- // auto width always implies auto height
- _autoHeight = true;
- }
- else
- {
- autoSize = false;
- wordWrap = true;
- textField.width = value;
- }
-
- _regen = true;
- return value;
- }
-
- function get_fieldWidth():Float
- {
- return (textField != null) ? textField.width : 0;
- }
-
- function get_fieldHeight():Float
- {
- return (textField != null) ? textField.height : 0;
- }
-
- function set_fieldHeight(value:Float):Float
- {
- if (textField == null)
- return value;
-
- if (value <= 0)
- {
- _autoHeight = true;
- }
- else
- {
- _autoHeight = false;
- textField.height = value;
- }
- _regen = true;
- return value;
- }
-
- function set_autoSize(value:Bool):Bool
- {
- if (textField != null)
- {
- textField.autoSize = value ? TextFieldAutoSize.LEFT : TextFieldAutoSize.NONE;
- _regen = true;
- }
-
- return value;
- }
-
- function get_autoSize():Bool
- {
- return (textField != null) ? (textField.autoSize != TextFieldAutoSize.NONE) : false;
- }
-
- function set_text(Text:String):String
- {
- text = Text;
- if (textField != null)
- {
- var ot:String = textField.text;
- textField.text = Uwuifier.uwuifySentence(Text);
- _regen = (textField.text != ot) || _regen;
- }
- return Text;
- }
-
- inline function get_size():Int
- {
- return Std.int(_defaultFormat.size);
- }
-
- function set_size(Size:Int):Int
- {
- _defaultFormat.size = Size;
- updateDefaultFormat();
- return Size;
- }
-
- inline function get_letterSpacing():Float
- {
- return _defaultFormat.letterSpacing;
- }
-
- function set_letterSpacing(LetterSpacing:Float):Float
- {
- _defaultFormat.letterSpacing = LetterSpacing;
- updateDefaultFormat();
- return LetterSpacing;
- }
-
- override function set_color(Color:FlxColor):Int
- {
- if (_defaultFormat.color == Color.to24Bit())
- {
- return Color;
- }
- _defaultFormat.color = Color.to24Bit();
- color = Color;
- updateDefaultFormat();
- return Color;
- }
-
- inline function get_font():String
- {
- return _font;
- }
-
- function set_font(Font:String):String
- {
- textField.embedFonts = true;
-
- if (Font != null)
- {
- var newFontName:String = Font;
- if (Assets.exists(Font, AssetType.FONT))
- {
- newFontName = Assets.getFont(Font).fontName;
- }
-
- _defaultFormat.font = newFontName;
- }
- else
- {
- _defaultFormat.font = FlxAssets.FONT_DEFAULT;
- }
-
- updateDefaultFormat();
- return _font = _defaultFormat.font;
- }
-
- inline function get_embedded():Bool
- {
- return textField.embedFonts;
- }
-
- inline function get_systemFont():String
- {
- return _defaultFormat.font;
- }
-
- function set_systemFont(Font:String):String
- {
- textField.embedFonts = false;
- _defaultFormat.font = Font;
- updateDefaultFormat();
- return Font;
- }
-
- inline function get_bold():Bool
- {
- return _defaultFormat.bold;
- }
-
- function set_bold(value:Bool):Bool
- {
- if (_defaultFormat.bold != value)
- {
- _defaultFormat.bold = value;
- updateDefaultFormat();
- }
- return value;
- }
-
- inline function get_italic():Bool
- {
- return _defaultFormat.italic;
- }
-
- function set_italic(value:Bool):Bool
- {
- if (_defaultFormat.italic != value)
- {
- _defaultFormat.italic = value;
- updateDefaultFormat();
- }
- return value;
- }
-
- inline function get_underline():Bool
- {
- return _defaultFormat.underline;
- }
-
- function set_underline(value:Bool):Bool
- {
- if (_defaultFormat.underline != value)
- {
- _defaultFormat.underline = value;
- updateDefaultFormat();
- }
- return value;
- }
-
- inline function get_wordWrap():Bool
- {
- return textField.wordWrap;
- }
-
- function set_wordWrap(value:Bool):Bool
- {
- if (textField.wordWrap != value)
- {
- textField.wordWrap = value;
- _regen = true;
- }
- return value;
- }
-
- inline function get_alignment():FlxTextAlign
- {
- return FlxTextAlign.fromOpenFL(_defaultFormat.align);
- }
-
- function set_alignment(Alignment:FlxTextAlign):FlxTextAlign
- {
- _defaultFormat.align = FlxTextAlign.toOpenFL(Alignment);
- updateDefaultFormat();
- return Alignment;
- }
-
- function set_borderStyle(style:FlxTextBorderStyle):FlxTextBorderStyle
- {
- if (style != borderStyle)
- _regen = true;
-
- return borderStyle = style;
- }
-
- function set_borderColor(Color:FlxColor):FlxColor
- {
- if (borderColor != Color && borderStyle != NONE)
- _regen = true;
- _hasBorderAlpha = Color.alphaFloat < 1;
- return borderColor = Color;
- }
-
- function set_borderSize(Value:Float):Float
- {
- if (Value != borderSize && borderStyle != NONE)
- _regen = true;
-
- return borderSize = Value;
- }
-
- function set_borderQuality(Value:Float):Float
- {
- Value = FlxMath.bound(Value, 0, 1);
- if (Value != borderQuality && borderStyle != NONE)
- _regen = true;
-
- return borderQuality = Value;
- }
-
- override function set_graphic(Value:FlxGraphic):FlxGraphic
- {
- var oldGraphic:FlxGraphic = graphic;
- var graph:FlxGraphic = super.set_graphic(Value);
- FlxG.bitmap.removeIfNoUse(oldGraphic);
- return graph;
- }
-
- override function get_width():Float
- {
- regenGraphic();
- return super.get_width();
- }
-
- override function get_height():Float
- {
- regenGraphic();
- return super.get_height();
- }
-
- override function updateColorTransform():Void
- {
- if (colorTransform == null)
- colorTransform = new ColorTransform();
-
- if (alpha != 1)
- {
- colorTransform.alphaMultiplier = alpha;
- useColorTransform = true;
- }
- else
- {
- colorTransform.alphaMultiplier = 1;
- useColorTransform = false;
- }
-
- dirty = true;
- }
-
- function regenGraphic():Void
- {
- if (textField == null || !_regen)
- return;
-
- var oldWidth:Int = 0;
- var oldHeight:Int = VERTICAL_GUTTER;
-
- if (graphic != null)
- {
- oldWidth = graphic.width;
- oldHeight = graphic.height;
- }
-
- var newWidth:Int = Math.ceil(textField.width);
- var textfieldHeight = _autoHeight ? textField.textHeight : textField.height;
- var vertGutter = _autoHeight ? VERTICAL_GUTTER : 0;
- // Account for gutter
- var newHeight:Int = Math.ceil(textfieldHeight) + vertGutter;
-
- // prevent text height from shrinking on flash if text == ""
- if (textField.textHeight == 0)
- {
- newHeight = oldHeight;
- }
-
- if (oldWidth != newWidth || oldHeight != newHeight)
- {
- // Need to generate a new buffer to store the text graphic
- height = newHeight;
- var key:String = FlxG.bitmap.getUniqueKey("text");
- makeGraphic(newWidth, newHeight, FlxColor.TRANSPARENT, false, key);
-
- if (_hasBorderAlpha)
- _borderPixels = graphic.bitmap.clone();
-
- if (_autoHeight)
- textField.height = newHeight;
-
- _flashRect.x = 0;
- _flashRect.y = 0;
- _flashRect.width = newWidth;
- _flashRect.height = newHeight;
- }
- else // Else just clear the old buffer before redrawing the text
- {
- graphic.bitmap.fillRect(_flashRect, FlxColor.TRANSPARENT);
- if (_hasBorderAlpha)
- {
- if (_borderPixels == null)
- _borderPixels = new BitmapData(frameWidth, frameHeight, true);
- else
- _borderPixels.fillRect(_flashRect, FlxColor.TRANSPARENT);
- }
- }
-
- if (textField != null && textField.text != null && textField.text.length > 0)
- {
- // Now that we've cleared a buffer, we need to actually render the text to it
- copyTextFormat(_defaultFormat, _formatAdjusted);
-
- _matrix.identity();
-
- applyBorderStyle();
- applyBorderTransparency();
- applyFormats(_formatAdjusted, false);
-
- drawTextFieldTo(graphic.bitmap);
- }
-
- _regen = false;
- resetFrame();
- }
-
- /**
- * Internal function to draw textField to a BitmapData, if flash it calculates every line x to avoid blurry lines.
- */
- function drawTextFieldTo(graphic:BitmapData):Void
- {
- #if flash
- if (alignment == FlxTextAlign.CENTER && isTextBlurry())
- {
- var h:Int = 0;
- var tx:Float = _matrix.tx;
- for (i in 0...textField.numLines)
- {
- var lineMetrics = textField.getLineMetrics(i);
-
- // Workaround for blurry lines caused by non-integer x positions on flash
- var diff:Float = lineMetrics.x - Std.int(lineMetrics.x);
- if (diff != 0)
- {
- _matrix.tx = tx + diff;
- }
- _textFieldRect.setTo(0, h, textField.width, lineMetrics.height + lineMetrics.descent);
-
- graphic.draw(textField, _matrix, null, null, _textFieldRect, false);
-
- _matrix.tx = tx;
- h += Std.int(lineMetrics.height);
- }
-
- return;
- }
- #elseif !web
- // Fix to render desktop and mobile text in the same visual location as web
- _matrix.translate(-1, -1); // left and up
- graphic.draw(textField, _matrix);
- _matrix.translate(1, 1); // return to center
- return;
- #end
-
- graphic.draw(textField, _matrix);
- }
-
- #if flash
- /**
- * Helper function for `drawTextFieldTo()`, this checks if thw workaround is needed to prevent blurry lines.
- */
- function isTextBlurry():Bool
- {
- for (i in 0...textField.numLines)
- {
- var lineMetricsX = textField.getLineMetrics(i).x;
- if (lineMetricsX - Std.int(lineMetricsX) != 0)
- {
- return true;
- }
- }
- return false;
- }
- #end
-
- override public function draw():Void
- {
- regenGraphic();
- super.draw();
- }
-
- /**
- * Internal function to update the current animation frame.
- *
- * @param RunOnCpp Whether the frame should also be recalculated if we're on a non-flash target
- */
- override function calcFrame(RunOnCpp:Bool = false):Void
- {
- if (textField == null)
- return;
-
- if (FlxG.renderTile && !RunOnCpp)
- return;
-
- regenGraphic();
- super.calcFrame(RunOnCpp);
- }
-
- function applyBorderStyle():Void
- {
- var iterations:Int = Std.int(borderSize * borderQuality);
- if (iterations <= 0)
- {
- iterations = 1;
- }
- var delta:Float = borderSize / iterations;
-
- switch (borderStyle)
- {
- case SHADOW:
- // Render a shadow beneath the text
- // (do one lower-right offset draw call)
- applyFormats(_formatAdjusted, true);
-
- for (i in 0...iterations)
- {
- copyTextWithOffset(delta, delta);
- }
-
- _matrix.translate(-shadowOffset.x * borderSize, -shadowOffset.y * borderSize);
-
- case OUTLINE:
- // Render an outline around the text
- // (do 8 offset draw calls)
- applyFormats(_formatAdjusted, true);
-
- var curDelta:Float = delta;
- for (i in 0...iterations)
- {
- copyTextWithOffset(-curDelta, -curDelta); // upper-left
- copyTextWithOffset(curDelta, 0); // upper-middle
- copyTextWithOffset(curDelta, 0); // upper-right
- copyTextWithOffset(0, curDelta); // middle-right
- copyTextWithOffset(0, curDelta); // lower-right
- copyTextWithOffset(-curDelta, 0); // lower-middle
- copyTextWithOffset(-curDelta, 0); // lower-left
- copyTextWithOffset(0, -curDelta); // lower-left
-
- _matrix.translate(curDelta, 0); // return to center
- curDelta += delta;
- }
-
- case OUTLINE_FAST:
- // Render an outline around the text
- // (do 4 diagonal offset draw calls)
- // (this method might not work with certain narrow fonts)
- applyFormats(_formatAdjusted, true);
-
- var curDelta:Float = delta;
- for (i in 0...iterations)
- {
- copyTextWithOffset(-curDelta, -curDelta); // upper-left
- copyTextWithOffset(curDelta * 2, 0); // upper-right
- copyTextWithOffset(0, curDelta * 2); // lower-right
- copyTextWithOffset(-curDelta * 2, 0); // lower-left
-
- _matrix.translate(curDelta, -curDelta); // return to center
- curDelta += delta;
- }
-
- case NONE:
- }
- }
-
- inline function applyBorderTransparency()
- {
- if (!_hasBorderAlpha)
- return;
-
- if (_borderColorTransform == null)
- _borderColorTransform = new ColorTransform();
-
- _borderColorTransform.alphaMultiplier = borderColor.alphaFloat;
- _borderPixels.colorTransform(_borderPixels.rect, _borderColorTransform);
- graphic.bitmap.draw(_borderPixels);
- }
-
- /**
- * Helper function for `applyBorderStyle()`
- */
- inline function copyTextWithOffset(x:Float, y:Float)
- {
- var graphic:BitmapData = _hasBorderAlpha ? _borderPixels : graphic.bitmap;
- _matrix.translate(x, y);
- drawTextFieldTo(graphic);
- }
-
- function applyFormats(FormatAdjusted:TextFormat, UseBorderColor:Bool = false):Void
- {
- // Apply the default format
- copyTextFormat(_defaultFormat, FormatAdjusted, false);
- FormatAdjusted.color = UseBorderColor ? borderColor.to24Bit() : _defaultFormat.color;
- textField.setTextFormat(FormatAdjusted);
-
- // Apply other formats
- for (formatRange in _formatRanges)
- {
- if (textField.text.length - 1 < formatRange.range.start)
- {
- // we can break safely because the array is ordered by the format start value
- break;
- }
- else
- {
- var textFormat:TextFormat = formatRange.format.format;
- copyTextFormat(textFormat, FormatAdjusted, false);
- FormatAdjusted.color = UseBorderColor ? formatRange.format.borderColor.to24Bit() : textFormat.color;
- }
-
- textField.setTextFormat(FormatAdjusted, formatRange.range.start, Std.int(Math.min(formatRange.range.end, textField.text.length)));
- }
- }
-
- function copyTextFormat(from:TextFormat, to:TextFormat, withAlign:Bool = true):Void
- {
- to.font = from.font;
- to.bold = from.bold;
- to.italic = from.italic;
- to.underline = from.underline;
- to.size = from.size;
- to.color = from.color;
- to.leading = from.leading;
- if (withAlign)
- to.align = from.align;
- }
-
- /**
- * A helper function for updating the TextField that we use for rendering.
- *
- * @return A writable copy of `TextField.defaultTextFormat`.
- */
- function dtfCopy():TextFormat
- {
- var dtf:TextFormat = textField.defaultTextFormat;
- return new TextFormat(dtf.font, dtf.size, dtf.color, dtf.bold, dtf.italic, dtf.underline, dtf.url, dtf.target, dtf.align);
- }
-
- inline function updateDefaultFormat():Void
- {
- textField.defaultTextFormat = _defaultFormat;
- textField.setTextFormat(_defaultFormat);
- _regen = true;
- }
-
- override function set_frames(Frames:FlxFramesCollection):FlxFramesCollection
- {
- super.set_frames(Frames);
- _regen = false;
- return Frames;
- }
-}
-
-@:allow(flixel.text.FlxText.applyFormats)
-class FlxTextFormat
-{
- /**
- * The leading (vertical space between lines) of the text.
- * @since 4.10.0
- */
- public var leading(default, set):Int;
-
- /**
- * The border color if the text has a shadow or a border
- */
- var borderColor:FlxColor;
-
- var format(default, null):TextFormat;
-
- /**
- * @param fontColor Font color, in `0xRRGGBB` format. Inherits from the default format by default.
- * @param bold Whether the text should be bold (must be supported by the font). `false` by default.
- * @param italic Whether the text should be in italics (must be supported by the font). Only works on Flash. `false` by default.
- * @param borderColor Border color, in `0xAARRGGBB` format. By default, no border (`null` / transparent).
- * @param underline Whether the text should be underlined. `false` by default.
- */
- public function new(?fontColor:FlxColor, ?bold:Bool, ?italic:Bool, ?borderColor:FlxColor, ?underline:Bool)
- {
- format = new TextFormat(null, null, fontColor, bold, italic, underline);
- this.borderColor = borderColor == null ? FlxColor.TRANSPARENT : borderColor;
- }
-
- function set_leading(value:Int):Int
- {
- format.leading = value;
- return value;
- }
-}
-
-class FlxTextFormatRange
-{
- public var range(default, null):FlxRange;
- public var format(default, null):FlxTextFormat;
-
- public function new(format:FlxTextFormat, start:Int, end:Int)
- {
- range = new FlxRange(start, end);
- this.format = format;
- }
-}
-
-class FlxTextFormatMarkerPair
-{
- public var format:FlxTextFormat;
- public var marker:String;
-
- public function new(format:FlxTextFormat, marker:String)
- {
- this.format = format;
- this.marker = marker;
- }
-}
-
-enum FlxTextBorderStyle
-{
- NONE;
-
- /**
- * A simple shadow to the lower-right.
- * Use `FlxText.shadowOffset` for custom placement.
- */
- SHADOW;
-
- /**
- * Outline on all 8 sides
- */
- OUTLINE;
-
- /**
- * Outline, optimized using only 4 draw calls (might not work for narrow and/or 1-pixel fonts)
- */
- OUTLINE_FAST;
-}
-
-enum abstract FlxTextAlign(String) from String
-{
- var LEFT = "left";
-
- /**
- * Warning: on Flash, this can have a negative impact on performance
- * of multiline texts that are frequently regenerated (especially with
- * `borderStyle == OUTLINE`) due to a workaround for blurry rendering.
- */
- var CENTER = "center";
-
- var RIGHT = "right";
- var JUSTIFY = "justify";
-
- public static function fromOpenFL(align:TextFormatAlign):FlxTextAlign
- {
- return switch (align)
- {
- case TextFormatAlign.LEFT: LEFT;
- case TextFormatAlign.CENTER: CENTER;
- case TextFormatAlign.RIGHT: RIGHT;
- case TextFormatAlign.JUSTIFY: JUSTIFY;
- default: LEFT;
- }
- }
-
- public static function toOpenFL(align:FlxTextAlign):TextFormatAlign
- {
- return switch (align)
- {
- case FlxTextAlign.LEFT: TextFormatAlign.LEFT;
- case FlxTextAlign.CENTER: TextFormatAlign.CENTER;
- case FlxTextAlign.RIGHT: TextFormatAlign.RIGHT;
- case FlxTextAlign.JUSTIFY: TextFormatAlign.JUSTIFY;
- default: TextFormatAlign.LEFT;
- }
- }
-}
diff --git a/source/flixel/text/Uwuifier.hx b/source/flixel/text/Uwuifier.hx
deleted file mode 100644
index 3b70d1444..000000000
--- a/source/flixel/text/Uwuifier.hx
+++ /dev/null
@@ -1,413 +0,0 @@
-package flixel.text;
-
-import flixel.math.FlxRandom;
-import haxe.Int64;
-
-using StringTools;
-
-class Uwuifier {
- public static var faces = [
- ";;w;;",
- "OwO",
- "UwU",
- ">w<",
- "^w^",
- "^-^",
- ":3",
- "x3",
- ":3c",
- ];
- public static var exclamations = ["!?", "?!!", "?!?1", "!!11", "?!?!"];
- public static var actions = [
- "*blushes*",
- "*whispers to self*",
- "*cries*",
- "*screams*",
- "*sweats*",
- "*runs away*",
- "*screeches*",
- "*walks away*",
- "*looks at you*",
- "*huggles tightly*",
- "*boops your nose*",
- ];
- public static var uwuMap:Array = [
- [~/(?:r|l)/g, "w"],
- [~/(?:R|L)/g, "W"],
- [~/n([aeiou])/g, "ny$1"],
- [~/N([aeiou])/g, "Ny$1"],
- [~/N([AEIOU])/g, "NY$1"],
- [~/ove/g, "uv"],
- ];
-
- private static var _spacesModifier = { faces: 0.05, actions: 0.075, stutters: 0.1 };
- private static var _wordsModifier:Float = 1;
- private static var _exclamationsModifier:Float = 1;
-
- public static function uwuifyWords(sentence: String): String {
- var words = sentence.split(" ");
-
- var uwuifiedSentence = words.map((word) -> {
- //if (isAt(word)) return word;
- if (word == "@") return word;
- //if (isUri(word)) return word;
-
- var seed = new Seed(word);
-
- for (aa in uwuMap) {
- var oldWord = aa[0];
- var newWord = aa[1];
-
- // Generate a random value for every map so words will be partly uwuified instead of not at all
- if (seed.random() > _wordsModifier) continue;
-
- //trace(oldWord, newWord, word);
- word = oldWord.replace(word, newWord);
- //trace(oldWord, newWord, word);
- }
-
- return word;
- }).join(" ");
-
- return uwuifiedSentence;
- }
-
- public static function uwuifySpaces(sentence: String): String {
- var words = sentence.split(" ");
-
- var faceThreshold = _spacesModifier.faces;
- var actionThreshold = _spacesModifier.actions + faceThreshold;
- var stutterThreshold = _spacesModifier.stutters + actionThreshold;
-
- var index = 0;
- var uwuifiedSentence = words.map((word) -> {
- var seed = new Seed(word);
- var random = seed.random();
-
- var firstCharacter = word.charAt(0);
-
- function checkCapital() {
- // Check if we should remove the first capital letter
- if (firstCharacter != firstCharacter.toUpperCase()) return;
- // if word has higher than 50% upper case
- if (getCapitalPercentage(word) > 0.5) return;
-
- // If it's the first word
- if (index == 0) {
- // Remove the first capital letter
- word = firstCharacter.toLowerCase() + word.substr(1);
- } else {
- var previousWord = words[index - 1];
- var previousWordLastChar = previousWord.charAt(previousWord.length - 1);
- var prevWordEndsWithPunctuation = (~/[.!?\\-]/).match(
- previousWordLastChar
- );
-
- if (!prevWordEndsWithPunctuation) return;
- word = firstCharacter.toLowerCase() + word.substr(1);
- }
- }
-
- if (random <= faceThreshold && faces.length > 0) {
- // Add random face before the word
- var a = seed.randomInt(0, faces.length - 1);
- //trace(a, faces.length, faces);
- word += " " + faces[a];
- checkCapital();
- } else if (random <= actionThreshold && actions.length > 0) {
- // Add random action before the word
- var a = seed.randomInt(0, actions.length - 1);
- //trace(a, actions.length, actions);
- word += " " + actions[a];
- checkCapital();
- } else if (random <= stutterThreshold/* && !isUri(word)*/) {
- // Add stutter with a length between 0 and 2
- var stutter = seed.randomInt(0, 2);
- index++;
- return [for (i in 0...stutter) (firstCharacter + "-")].join("") + word;
- //return (firstCharacter + "-").repeat(stutter) + word;
- }
-
- index++;
-
- return word;
- }).join(" ");
-
- return uwuifiedSentence;
- }
-
- public static function uwuifyExclamations(sentence: String): String {
- var words = sentence.split(" ");
- var pattern = ~/[?!]+$/;
-
- var uwuifiedSentence = words.map((word) -> {
- var seed = new Seed(word);
-
- // If there are no exclamations return
- if (
- !pattern.match(word) || seed.random() > _exclamationsModifier
- ) {
- return word;
- }
-
- word = pattern.replace(word, "");//.replace(pattern, "");
- word += exclamations[seed.randomInt(0, exclamations.length - 1)];
-
- return word;
- }).join(" ");
-
- return uwuifiedSentence;
- }
-
- public static var disableUWU:Bool = false;
-
- public static function uwuifySentence(sentence: String): String {
- if(sentence.trim().length == 0 || disableUWU) return sentence;
-
- var uwuifiedString = sentence;
-
- uwuifiedString = uwuifyWords(uwuifiedString);
- //uwuifiedString = uwuifyExclamations(uwuifiedString);
- uwuifiedString = uwuifySpaces(uwuifiedString);
-
- //trace(uwuifiedString);
-
- return uwuifiedString;
- }
-
- static function isLetter(char: String) {
- //return ~/^\p{L}/u.match(char);
- return ~/^[a-zA-Z]/i.match(char);
- }
- static function isUpperCase(char: String) {
- return char == char.toUpperCase();
- }
-
- static function getCapitalPercentage(str: String): Float {
- var totalLetters = 0;
- var upperLetters = 0;
-
- for (currentLetter in str.split("")) {
- if (!isLetter(currentLetter)) continue;
-
- if (isUpperCase(currentLetter)) {
- upperLetters++;
- }
-
- totalLetters++;
- }
-
- return upperLetters / totalLetters;
- }
-}
-
-class Crc32 {
- var crc:Int;
-
- public inline function new() {
- crc = 0xFFFFFFFF;
- }
-
- public inline function update(b:String, pos, len) {
- //var b = b.getData();
- for (i in pos...pos + len) {
- var tmp = (crc ^ b.charCodeAt(i)) & 0xFF;
- for (j in 0...8)
- tmp = (tmp >>> 1) ^ (-(tmp & 1) & 0xEDB88320);
- crc = (crc >>> 8) ^ tmp;
- }
- }
-
- public inline function get() {
- return crc ^ 0xFFFFFFFF;
- }
- public inline function getSinged() {
- return crc ^ 0xFFFFFFFF;
- }
-
- /**
- Calculates the CRC32 of the given data bytes
- **/
- public static function make(data:String):Int {
- var c = new Crc32();
- c.update(data, 0, data.length);
- var a = c.getSinged();
- if(a < 0) {
- a = -a;
- }
- return a;
- }
-}
-
-
-class Seed {
- private var seeder: FlxRandom;
-
- public function new(seed: String) {
- this.seeder = new FlxRandom();
- seeder.initialSeed = Crc32.make(seed);
- //trace(seeder.initialSeed, seed, Crc32.make(seed));
- }
-
- public function random(min:Float = 0, max:Float = 1): Float {
- // Make sure the minimum and maximum values are correct
- if (min > max) {
- throw ("The minimum value must be below the maximum value");
- }
- if (min == max) {
- throw ("The minimum value cannot equal the maximum value");
- }
-
- return this.denormalize(seeder.float(0, 1), min, max);
- }
-
- public function randomInt(min:Float = 0, max:Float = 1): Int {
- return Math.round(this.random(min, max));
- }
-
- private function denormalize(value: Float, min: Float, max: Float): Float {
- return value * (max - min) + min;
- }
-
- /* private function imul(a:Int, b:Int) {
- return a * (b & 65535) + (a * (b >>> 16) << 16 | 0) | 0;
- }
- private function imul64(a:Int64, b:Int64) {
- return Int64.mul(a, b);//a * (b & 65535) + (a * (b >>> 16) << 16 | 0) | 0;
- }
-
- // https://github.com/bryc/code/blob/master/jshash/PRNGs.md
- private function xmur3(str: String): Void -> Int64 {
- var h = Int64.make(0, 1779033703) ^ Int64.make(0, str.length);
-
- //for (let i = 0; i < str.length; i++) {
- var aa = Int64.parseString("3432918353");
- for(i in 0...str.length) {
- h = imul64(h ^ Int64.make(0, str.charCodeAt(i)), aa);
- h = h << 13 | h >>> 19;
- }
-
- var bb = Int64.parseString("2246822507");
- var cc = Int64.parseString("3266489909");
-
- return () -> {
- h = imul64(h ^ h >>> 16, bb);
- h = imul64(h ^ h >>> 13, cc);
- return (h ^= h >>> 16) >>> 0;
- };
- }
-
- static function toint32(a:Int64):Int64 {
- return a & 0xFFFFFFFF;//Int64.make(0, Int64.toInt(a & 0xFFFFFFFF));
- }
-
- // https://github.com/bryc/code/blob/master/jshash/PRNGs.md
- private function sfc32(): Int {
- var a = this.seeder();
- var b = this.seeder();
- var c = this.seeder();
- var d = this.seeder();
-
- a = toint32(a);
- b = toint32(b);
- c = toint32(c);
- d = toint32(d);
- // a >>>= 0;
- // b >>>= 0;
- // c >>>= 0;
- // d >>>= 0;
- var t = (a + b) | 0;
- a = b ^ (toint32(b >> 9));
- b = (c + (c << 3)) | 0;
- c = (c << 21) | (toint32(c >> 11));
- d = (d + 1) | 0;
- t = (t + d) | 0;
- c = (c + t) | 0;
- return Int64.toInt(toint32(toint32(t) / Int64.parseString("4294967296")));
- }*/
-}
-
-/*class Seed {
- private var seeder: Void -> Int64;
-
- public function new(seed: String) {
- this.seeder = this.xmur3(seed);
- }
-
- public function random(min = 0, max = 1): Float {
- // Make sure the minimum and maximum values are correct
- if (min > max) {
- throw ("The minimum value must be below the maximum value");
- }
- if (min == max) {
- throw ("The minimum value cannot equal the maximum value");
- }
-
- return this.denormalize(this.sfc32(), min, max);
- }
-
- public function randomInt(min = 0, max = 1): Int {
- return Math.round(this.random(min, max));
- }
-
- private function denormalize(value: Float, min: Float, max: Float): Float {
- return value * (max - min) + min;
- }
-
- private function imul(a:Int, b:Int) {
- return a * (b & 65535) + (a * (b >>> 16) << 16 | 0) | 0;
- }
- private function imul64(a:Int64, b:Int64) {
- return Int64.mul(a, b);//a * (b & 65535) + (a * (b >>> 16) << 16 | 0) | 0;
- }
-
- // https://github.com/bryc/code/blob/master/jshash/PRNGs.md
- private function xmur3(str: String): Void -> Int64 {
- var h = Int64.make(0, 1779033703) ^ Int64.make(0, str.length);
-
- //for (let i = 0; i < str.length; i++) {
- var aa = Int64.parseString("3432918353");
- for(i in 0...str.length) {
- h = imul64(h ^ Int64.make(0, str.charCodeAt(i)), aa);
- h = h << 13 | h >>> 19;
- }
-
- var bb = Int64.parseString("2246822507");
- var cc = Int64.parseString("3266489909");
-
- return () -> {
- h = imul64(h ^ h >>> 16, bb);
- h = imul64(h ^ h >>> 13, cc);
- return (h ^= h >>> 16) >>> 0;
- };
- }
-
- static function toint32(a:Int64):Int64 {
- return a & 0xFFFFFFFF;//Int64.make(0, Int64.toInt(a & 0xFFFFFFFF));
- }
-
- // https://github.com/bryc/code/blob/master/jshash/PRNGs.md
- private function sfc32(): Int {
- var a = this.seeder();
- var b = this.seeder();
- var c = this.seeder();
- var d = this.seeder();
-
- a = toint32(a);
- b = toint32(b);
- c = toint32(c);
- d = toint32(d);
- // a >>>= 0;
- // b >>>= 0;
- // c >>>= 0;
- // d >>>= 0;
- var t = (a + b) | 0;
- a = b ^ (toint32(b >> 9));
- b = (c + (c << 3)) | 0;
- c = (c << 21) | (toint32(c >> 11));
- d = (d + 1) | 0;
- t = (t + d) | 0;
- c = (c + t) | 0;
- return Int64.toInt(toint32(toint32(t) / Int64.parseString("4294967296")));
- }
-}*/
\ No newline at end of file
diff --git a/source/funkin/backend/system/MainState.hx b/source/funkin/backend/system/MainState.hx
index 8100f6608..885da7b0f 100644
--- a/source/funkin/backend/system/MainState.hx
+++ b/source/funkin/backend/system/MainState.hx
@@ -66,9 +66,6 @@ class MainState extends FlxState {
betaWarningShown = true;
}
- WindowUtils.resetTitle();
- WindowUtils.updateTitle();
-
#if sys
sys.FileSystem.createDirectory('./.temp/');
#if windows new funkin.backend.utils.native.HiddenProcess("attrib +h .temp"); #end
diff --git a/source/funkin/backend/system/framerate/CodenameBuildField.hx b/source/funkin/backend/system/framerate/CodenameBuildField.hx
index 0c838cd41..2cef4a26c 100644
--- a/source/funkin/backend/system/framerate/CodenameBuildField.hx
+++ b/source/funkin/backend/system/framerate/CodenameBuildField.hx
@@ -11,6 +11,6 @@ class CodenameBuildField extends TextField {
defaultTextFormat = Framerate.textFormat;
autoSize = LEFT;
multiline = wordWrap = false;
- text = flixel.text.Uwuifier.uwuifySentence('Codename Engine ${Main.releaseCycle}\nCommit ${GitCommitMacro.commitNumber} (${GitCommitMacro.commitHash})');
+ text = 'Codename Engine ${Main.releaseCycle}\nCommit ${GitCommitMacro.commitNumber} (${GitCommitMacro.commitHash})';
}
}
diff --git a/source/funkin/backend/utils/WindowUtils.hx b/source/funkin/backend/utils/WindowUtils.hx
index 7fcf30a69..571f781a4 100644
--- a/source/funkin/backend/utils/WindowUtils.hx
+++ b/source/funkin/backend/utils/WindowUtils.hx
@@ -1,6 +1,5 @@
package funkin.backend.utils;
-import flixel.text.Uwuifier;
import openfl.Lib;
class WindowUtils {
@@ -53,7 +52,7 @@ class WindowUtils {
}
public static inline function updateTitle()
- Lib.application.window.title = Uwuifier.uwuifySentence('$prefix$winTitle$suffix');
+ Lib.application.window.title = '$prefix$winTitle$suffix';
// backwards compat
@:noCompletion public static var endfix(get, set):String;
diff --git a/source/funkin/editors/charter/Charter.hx b/source/funkin/editors/charter/Charter.hx
index 56c49ea09..1071763ab 100644
--- a/source/funkin/editors/charter/Charter.hx
+++ b/source/funkin/editors/charter/Charter.hx
@@ -720,14 +720,6 @@ class Charter extends UIState {
}
}
- public function updateAprilFools(elapsed:Float) {
- if (FlxG.random.bool(.05))
- openfl.Lib.application.window.warpMouse(
- FlxG.random.int(0, openfl.Lib.application.window.width),
- FlxG.random.int(0, openfl.Lib.application.window.height)
- );
- }
-
var deletedNotes:Selection = new Selection();
public function updateNoteLogic(elapsed:Float) {
updateSelectionLogic();
@@ -1148,15 +1140,9 @@ class Charter extends UIState {
var __crochet:Float;
var __firstFrame:Bool = true;
- var __timer:Float = 0;
public override function update(elapsed:Float) {
- __timer += elapsed;
- for (shader in waveformHandler.waveShaders)
- shader.data.time.value = [__timer];
-
updateNoteLogic(elapsed);
updateAutoSaving(elapsed);
- updateAprilFools(elapsed);
if (FlxG.sound.music.playing || __firstFrame) {
gridBackdrops.conductorSprY = curStepFloat * 40;
diff --git a/source/funkin/game/PlayState.hx b/source/funkin/game/PlayState.hx
index c177eab89..f585e89f7 100644
--- a/source/funkin/game/PlayState.hx
+++ b/source/funkin/game/PlayState.hx
@@ -557,7 +557,7 @@ class PlayState extends MusicBeatState
// CHARACTER INITIALIZATION
#if REGION
comboGroup = new RotatingSpriteGroup(FlxG.width * 0.55, (FlxG.height * 0.5) - 60);
- comboGroup.maxSize = 200;
+ comboGroup.maxSize = 25;
#end
// CAMERA FOLLOW, SCRIPTS & STAGE INITIALIZATION
@@ -1704,7 +1704,7 @@ class PlayState extends MusicBeatState
var pre:String = evt != null ? evt.ratingPrefix : "";
var suf:String = evt != null ? evt.ratingSuffix : "";
- var separatedScore:String = [for (i in 0...FlxG.random.int(1, 22)) FlxG.random.int(1,9)].join("");
+ var separatedScore:String = Std.string(combo).addZeros(3);
if (combo == 0 || combo >= 10) {
if (combo >= 10) {
diff --git a/source/funkin/menus/MainMenuState.hx b/source/funkin/menus/MainMenuState.hx
index 1b7784bb8..b17e9db66 100644
--- a/source/funkin/menus/MainMenuState.hx
+++ b/source/funkin/menus/MainMenuState.hx
@@ -60,17 +60,11 @@ class MainMenuState extends MusicBeatState
for (i=>option in optionShit)
{
- var menuItem:FlxSprite = new FlxSprite(0, 60 + (i * 130));
+ var menuItem:FlxSprite = new FlxSprite(0, 60 + (i * 160));
menuItem.frames = Paths.getFrames('menus/mainmenu/${option}');
menuItem.animation.addByPrefix('idle', option + " basic", 24);
menuItem.animation.addByPrefix('selected', option + " white", 24);
menuItem.animation.play('idle');
- menuItem.scale.set(0.8, 0.8);
- if (option == "visual novel") {
- menuItem.scale.set(0.7, 0.7);
- menuItem.y += 8;
- }
- menuItem.updateHitbox();
menuItem.ID = i;
menuItem.screenCenter(X);
menuItems.add(menuItem);
@@ -167,7 +161,6 @@ class MainMenuState extends MusicBeatState
switch (daChoice)
{
case 'story mode': FlxG.switchState(new StoryMenuState());
- case 'visual novel': FlxG.switchState(new VisualNovel());
case 'freeplay': FlxG.switchState(new FreeplayState());
case 'donate': FlxG.switchState(new CreditsMain());
case 'options': FlxG.switchState(new OptionsMenu());
@@ -198,9 +191,6 @@ class MainMenuState extends MusicBeatState
spr.updateHitbox();
spr.centerOffsets();
-
- if (spr.ID == optionShit.indexOf("visual novel") && spr.ID == curSelected)
- spr.offset.y += 26; // this sprite really weird -lunar
});
}
}
diff --git a/source/funkin/menus/TitleState.hx b/source/funkin/menus/TitleState.hx
index 7df24d1fa..4aca30dbf 100644
--- a/source/funkin/menus/TitleState.hx
+++ b/source/funkin/menus/TitleState.hx
@@ -69,7 +69,6 @@ class TitleState extends MusicBeatState
titleText.animation.addByPrefix('press', "ENTER PRESSED", 24);
titleText.antialiasing = true;
titleText.animation.play('idle');
- titleText.screenCenter(X);
titleText.updateHitbox();
}
add(titleText);
diff --git a/source/funkin/menus/VisualNovel.hx b/source/funkin/menus/VisualNovel.hx
deleted file mode 100644
index 75e52513b..000000000
--- a/source/funkin/menus/VisualNovel.hx
+++ /dev/null
@@ -1,507 +0,0 @@
-package funkin.menus;
-
-import flixel.addons.text.FlxTypeText;
-import flixel.util.FlxColor;
-import flixel.text.FlxText;
-import flixel.FlxG;
-import flixel.tweens.FlxTween;
-import flixel.group.FlxSpriteGroup;
-import flixel.group.FlxGroup.FlxTypedGroup;
-import flixel.FlxSprite;
-import flixel.util.FlxStringUtil;
-import haxe.Exception;
-import haxe.xml.Access;
-import flixel.math.FlxRect;
-
-using StringTools;
-
-class VisualNovel extends MusicBeatState {
- public static var allowInput = true;
-
- var entries:Array = [];
- var characterMap:Map = [];
- var redirectMap:Map = [];
-
- var currentEntryId:Int = 0;
- var currentEntry(get, never):Entry;
- function get_currentEntry() {
- return entries[currentEntryId];
- }
-
- function next() @:privateAccess {
- if (text._typing) {
- text.skip();
- return;
- }
-
- if(currentEntry.next != null) {
- currentEntryId = redirectMap[currentEntry.next];
- } else {
- currentEntryId++;
- if(currentEntryId == entries.length)
- currentEntryId = 0;
- }
-
- showEntry();
- }
-
- var totalChoices = 0;
-
- override function create() {
- super.create();
-
- allowInput = true;
-
- FlxG.sound.playMusic("assets/images/vn/senpaimusic.ogg", 0);
- FlxG.sound.music.fadeIn(1, 0, 0.8);
-
- flixel.text.Uwuifier.disableUWU = true;
-
- var plainXML = Assets.getText("assets/images/vn/vn.xml");
-
- var vxml = Xml.parse(plainXML).firstElement();
- if (vxml == null)
- throw new Exception("Missing \"vn\" node in XML.");
- var xml = new Access(vxml);
-
- var backgrounds = [];
- var characters = [];
-
- for(char in xml.elements) {
- if(char.name == "character") {
- var c = new CharInfo();
- c.id = char.att.id;
-
- c.name = char.node.name.innerData;
- c.color = FlxColor.fromString("#" + char.node.color.innerData);
- c.image = char.node.image.innerData;
- c.scale = Std.parseFloat(char.node.scale.innerData);
- c.side = char.hasNode.side ? char.node.side.innerData : "left";
- if(char.hasNode.offset) {
- var aa = char.node.offset.innerData.split(",");
- c.offsetX = Std.parseFloat(aa[0]);
- c.offsetY = Std.parseFloat(aa[1]);
- }
-
- characters.push(c);
- characterMap.set(c.id, c);
- }
- }
-
- var i = 0;
- for(entry in xml.elements) {
- if(entry.name != "entry") continue;
-
- //trace(entry);
-
- var e = new Entry();
- e.bg = entry.has.bg ? entry.att.bg : null;
- e.character = entry.has.character ? entry.att.character : null;
- e.id = entry.has.id ? entry.att.id : null;
- e.next = entry.has.next ? entry.att.next : null;
-
- if(e.id != null) {
- redirectMap[e.id] = i;
- }
-
- if(e.bg != null && !backgrounds.contains(e.bg)) {
- backgrounds.push(e.bg);
- }
- if(e.character != null && !characterMap.exists(e.character)) {
- throw "Missing Character XML Code " + e.character;
- }
-
- var _entry:Xml = cast entry;
-
- e.text = _entry.firstChild().nodeValue.trim().replace("\r\n", "\n");
-
- var choices = [];
-
- for(choice in entry.nodes.choice) {
- var c = new Choice();
- c.text = choice.innerData.trim();
- c.redirect = choice.has.id ? choice.att.id : null;
-
- choices.push(c);
- }
-
- if(choices.length > totalChoices)
- totalChoices = choices.length;
-
- e.choices = choices;
-
- entries.push(e);
- i++;
- }
-
- /*trace("");
- trace("");
- trace("");
-
- for(entry in entries) {
- trace(entry);
- }*/
-
- grpBackgrounds = new FlxTypedGroup();
- for(bg in backgrounds) {
- var b = new FlxSprite(Paths.image("vn/bgs/" + bg));
- b.alpha = 0.00001;
- b.setGraphicSize(FlxG.width);
- b.antialiasing = true;
- b.screenCenter();
- b.active = false;
- grpBackgrounds.add(b);
-
- bgMap.set(bg, b);
- }
- add(grpBackgrounds);
-
- var COCK = 230;
-
- grpPortraits = new FlxTypedGroup();
- for(char in characters) {
- var b = new FlxSprite(Paths.image("vn/portraits/" + char.image));
- b.alpha = 0.00001;
- b.y = FlxG.height - b.height;
- if(char.side == "right") {
- b.x = FlxG.width - b.width;
- b.x -= 100;
- b.origin.set(b.frameWidth, b.frameHeight);
- } else if(char.side == "center") {
- b.screenCenter(X);
- } else {
- b.x = 0;
- b.x += 100;
- b.origin.set(0, b.frameHeight);
- }
- b.y -= COCK;
- b.x += char.offsetX;
- b.y += char.offsetY;
- b.scale.set(char.scale, char.scale);
- b.antialiasing = true;
- grpPortraits.add(b);
-
- chMap.set(char.id, b);
- }
- add(grpPortraits);
-
- var fade = new FlxSprite(Paths.image("vn/box"));
- fade.setGraphicSize(FlxG.width, fade.frameHeight);
- fade.updateHitbox();
- fade.screenCenter();
- fade.antialiasing = true;
- fade.y = FlxG.height - fade.height;
- //fade.origin.set(fade.origin.x, fade.frameHeight);
- //fade.scale.y *= 0.4;
- add(fade);
-
- fade.y -= COCK;
-
- var box = new FlxSprite().makeSolid(FlxG.width, COCK, FlxColor.BLACK);
- box.y = FlxG.height - box.height;
- add(box);
-
- grpChoices = new FlxTypedGroup();
- for(i in 0...totalChoices) {
- var b = new ChoiceButton();
- //b.alpha = 0.00001;
- b.exists = false;
- //b.y = FlxG.height - b.height;
- b.redirectID = 0;
- b.onSelected = () -> {
- if(b.redirectID == -99) {
- exit();
- } else {
- currentEntryId = b.redirectID;
- showEntry();
- }
- }
- grpChoices.add(b);
- }
- add(grpChoices);
-
- name = new FlxText(30, 500 - 60, FlxG.width - 40, "", 32);
- name.font = Paths.font("fnf.ttf");
- name.bold = true;
- name.antialiasing = true;
- add(name);
-
- text = new FlxTypeText(30, 500, FlxG.width - 40, "", 32);
- text.font = Paths.font("fnf.ttf");
- text.bold = true;
- text.antialiasing = true;
- text.sounds = [FlxG.sound.load("assets/images/vn/sound_13.wav", 0.6)];
- add(text);
-
- showEntry();
- }
-
- var chMap:Map = [];
- var bgMap:Map = [];
- var grpBackgrounds:FlxTypedGroup;
- var grpPortraits:FlxTypedGroup;
- var grpChoices:FlxTypedGroup;
- var text:FlxTypeText;
- var name:FlxText;
-
- function showEntry(instant:Bool = false) {
- var entry = currentEntry;
-
- // bg
- for(bg=>spr in bgMap) {
- FlxTween.cancelTweensOf(spr);
- FlxTween.tween(spr, {alpha: 0.00001}, 0.3);
- }
-
- if(entry.bg != null) {
- var bg = bgMap[entry.bg];
- FlxTween.cancelTweensOf(bg);
- FlxTween.tween(bg, {alpha: 1}, 0.3);
- }
-
- // character
- for(ch=>spr in chMap) {
- FlxTween.cancelTweensOf(spr);
- FlxTween.tween(spr, {alpha: 0.00001}, 0.3);
- }
-
- if(entry.character != null) {
- var ch = chMap[entry.character];
- FlxTween.cancelTweensOf(ch);
- FlxTween.tween(ch, {alpha: 1}, 0.3);
- }
-
- grpChoices.forEach(spr -> {
- spr.exists = false;
- });
-
- //var offset = totalChoices - entry.choices.length;
-
- var i = 0;
- for(choice in entry.choices) {
- var spr = grpChoices.members[i];
-
- spr.exists = true;
- spr.text.text = choice.text;
- spr.redirectID = choice.redirect != null ? redirectMap[choice.redirect] : currentEntryId + 1;
- if(choice.redirect == "exit")
- spr.redirectID = -99;
- spr.y = 100 + 80 * (i/* + offset*/);
-
- i++;
- }
-
- //trace(characterMap);
- //trace(entry.character);
-
- if(entry.character != null) {
- var charInfo = characterMap.get(entry.character);
-
- name.text = charInfo.name;
- name.color = charInfo.color;
- name.exists = true;
- } else {
- name.exists = false;
- }
-
- //text.text = entry.text;
-
- text.resetText(entry.text);
- text.start(0.04, true);
- dialogueEnded = false;
-
-
- grpChoices.forEach(spr -> {
- spr.active = spr.visible = false;
- });
-
- text.completeCallback = function() {
- dialogueEnded = true;
-
- grpChoices.forEach(spr -> {
- spr.active = spr.visible = true;
- });
- };
- }
-
- var dialogueEnded:Bool = false;
-
- function exit() {
- flixel.text.Uwuifier.disableUWU = false;
- FlxG.switchState(new MainMenuState());
- FlxG.sound.music.stop();
- CoolUtil.playMenuSong();
- //FlxG.sound.music.fadeOut(1, 0, function(_) {
- // FlxG.sound.music.stop();
- //});
- }
-
- override function update(elapsed:Float) {
- super.update(elapsed);
-
- FlxG.mouse.visible = true;
-
- if(allowInput) {
- if((FlxG.mouse.justPressed || controls.ACCEPT) && currentEntry.choices.length == 0) {
- next();
- }
- }
-
- if(controls.BACK) {
- exit();
- }
-
- allowInput = true;
- }
-}
-
-class CharInfo {
- public var id:String = "";
- public var name:String = "";
- public var image:String = "";
- public var color:FlxColor;
- public var scale:Float = 1;
- public var side:String = "";
- public var offsetX:Float = 0;
- public var offsetY:Float = 0;
-
- public function new() {
-
- }
-
- public function toString() {
- return FlxStringUtil.getDebugString([
- LabelValuePair.weak("id", id),
- LabelValuePair.weak("name", name),
- LabelValuePair.weak("image", image),
- LabelValuePair.weak("color", color),
- LabelValuePair.weak("scale", scale),
- LabelValuePair.weak("side", side),
- ]);
- }
-}
-
-class Entry {
- public var id:Null = "";
- public var character:String = "";
- public var bg:Null = "";
- public var next:String = "";
-
- public var text:String = "";
-
- public var choices:Array = [];
-
- public function new() {
-
- }
-
- public function toString() {
- return FlxStringUtil.getDebugString([
- LabelValuePair.weak("id", id),
- LabelValuePair.weak("character", character),
- LabelValuePair.weak("bg", bg),
- LabelValuePair.weak("next", next),
- LabelValuePair.weak("choices", choices),
- ]);
- }
-}
-
-class Choice {
- public var text:String = "";
- public var redirect:Null = "";
-
- public function new() {
-
- }
-
- public function toString() {
- return text + " => " + redirect;
- }
-}
-
-class ChoiceButton extends FlxSpriteGroup {
- public var idle:FlxSprite;
- public var sele:FlxSprite;
- public var text:FlxText;
-
- public var onSelected:Void->Void = null;
- public var redirectID:Int = 0;
-
- public function new(X:Float = 0, Y:Float = 0) {
- super(X, Y);
-
- idle = new FlxSprite(Paths.image("vn/options"));
- sele = new FlxSprite(Paths.image("vn/options_selected"));
-
- idle.antialiasing = true;
- sele.antialiasing = true;
-
- idle.scale.set(0.666, 0.666);
- sele.scale.set(0.666, 0.666);
-
- idle.updateHitbox();
- sele.updateHitbox();
-
- sele.alpha = 0.00001;
-
- moves = false;
-
- text = new FlxText(0, 0, FlxG.width, "PLACEHOLDER", 32);
- text.y = Math.abs(text.height / 2 - idle.height / 2);
- text.font = Paths.font("fnf.ttf");
- text.bold = true;
- text.antialiasing = true;
- text.alignment = CENTER;
-
- add(idle);
- add(sele);
-
- add(text);
- }
-
- public var selected(default, set):Bool = false;
- function set_selected(v:Bool) {
- idle.alpha = !v ? 1 : 0.00001;
- sele.alpha = v ? 1 : 0.00001;
- return selected = v;
- }
-
- override function update(elapsed:Float) {
- if(!exists) return;
- if(!VisualNovel.allowInput) return;
-
- super.update(elapsed);
-
- if(FlxG.mouse.justMoved) {
- if(checkOverlap(idle, 30, 5)) {
- selected = true;
- } else {
- selected = false;
- }
- }
-
- if(FlxG.mouse.justPressed) {
- if(checkOverlap(idle, 30, 5)) {
- VisualNovel.allowInput = false;
- if(onSelected != null)
- onSelected();
- }
- }
-
- text.screenCenter(X);
- idle.screenCenter(X);
- sele.screenCenter(X);
- }
-
- function checkOverlap(group:FlxSprite, widthExtend:Float = 0, heightExtend:Float = 0) {
- var mouse = FlxG.mouse.getPosition();
-
- var rect = FlxRect.weak(group.x - widthExtend/2, group.y - heightExtend/2, group.width + widthExtend, group.height + heightExtend);
- var val = mouse.inRect(rect);
-
- rect.putWeak();
- mouse.put();
-
- return val;
- }
-}
\ No newline at end of file
diff --git a/source/funkin/menus/ui/Alphabet.hx b/source/funkin/menus/ui/Alphabet.hx
index 42e3db278..d4c3db477 100644
--- a/source/funkin/menus/ui/Alphabet.hx
+++ b/source/funkin/menus/ui/Alphabet.hx
@@ -150,7 +150,7 @@ class Alphabet extends FlxSpriteGroup
function doSplitWords():Void
{
- splitWords = flixel.text.Uwuifier.uwuifySentence(_finalText).split("");
+ splitWords = _finalText.split("");
}
//public var personTalking:String = 'gf';