Files
CodenameEngine/source/flixel/text/Uwuifier.hx
T
lunarcleint 014be749e6 Squashed commit of the following:
commit 4987983dc6e655183b34258fed905be2fba73e0a
Author: lunarcleint <88809950+lunarcleint@users.noreply.github.com>
Date:   Mon Apr 1 06:32:22 2024 -0700

    fix charter bug

commit 1135b53d4d4ab48fb74a9d5693579d0a2e4923db
Author: lunarcleint <88809950+lunarcleint@users.noreply.github.com>
Date:   Mon Apr 1 00:46:53 2024 -0700

    small changes

commit 102931f3511c9f0423cf887ebf91eaeeb1024abe
Author: lunarcleint <88809950+lunarcleint@users.noreply.github.com>
Date:   Sun Mar 31 23:03:03 2024 -0700

    update spelling mistakes

commit 87ad53ae91bc8b4d3b49af3ebb8c07db9f13765b
Author: lunarcleint <88809950+lunarcleint@users.noreply.github.com>
Date:   Sun Mar 31 22:40:48 2024 -0700

    Chart editor updates

commit 8f7cae8a80a681158ff125c3e2547c9fd4dee7c1
Author: NeeEoo <NeeEoo@users.noreply.github.com>
Date:   Mon Apr 1 07:03:30 2024 +0200

    Redesigned Chart Editor

commit dbb94ba3bd8455a91883d6e5b59b25da87aefa32
Author: NeeEoo <NeeEoo@users.noreply.github.com>
Date:   Mon Apr 1 02:20:57 2024 +0200

    Added Stage Editor
2024-04-01 06:44:28 -07:00

413 lines
10 KiB
Haxe

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<Dynamic> = [
[~/(?: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")));
}
}*/