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
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,413 @@
|
||||
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")));
|
||||
}
|
||||
}*/
|
||||
Reference in New Issue
Block a user