Fix typos
This commit is contained in:
+3
-3
@@ -13,7 +13,7 @@ _**QOL = Quality of Life**_
|
||||
- Downscroll
|
||||
- Ghost Tapping
|
||||
- Opponent & Co-op modes
|
||||
- Memory optimisation (most of the game runs < 500mb)
|
||||
- Memory optimization (most of the game runs < 500mb)
|
||||
- Usage of [flxanimate](https://github.com/Dot-Stuff/flxanimate) on big sprites, such as Girlfriend to save memory.
|
||||
- You can further optimize it on certain stages by enabling `Low Memory Mode` in `Options > Appearance`.
|
||||
- New volume change SFX (no more loud flixel beep, customizable)
|
||||
@@ -36,7 +36,7 @@ _**QOL = Quality of Life**_
|
||||
- Support for `hscript-improved`, a fork made to allow HScript to push modding even further
|
||||
- Allows for imports
|
||||
- Allows for public variables (variables shared between every script in a ScriptPack such as a song scripts)
|
||||
- Allows for static variables (variabels shared between every single script ran in this mod)
|
||||
- Allows for static variables (variables shared between every single script ran in this mod)
|
||||
- Allows you to use for example `boyfriend` instead of `PlayState.boyfriend` or `game.boyfriend`, for smaller and easier to comprehend code.
|
||||
- Allows you to use `@:bypassAccessor`
|
||||
- Allows you to use maps
|
||||
@@ -59,7 +59,7 @@ _**QOL = Quality of Life**_
|
||||
- Position them
|
||||
- Add animations
|
||||
- Change their scale
|
||||
- Change their scrollfactor
|
||||
- Change their scroll factor
|
||||
- Change their zoomfactor
|
||||
- Turn on/off their antialiasing (on by default)
|
||||
- Change additional properties via child nodes.
|
||||
|
||||
+3
-3
@@ -15,7 +15,7 @@
|
||||
- New SEXY editor assets by paige and nex!!!! (and lunar, does 16x16 even count??? 😭)
|
||||
- NEW EVENTS (Camera events, play animation, scroll speed change)
|
||||
- Events window is now scrollable (more events, more room)
|
||||
- Custom Properities in Meta AND Character (Editable in Charter and Character Editor :D) (accessible with SONG.meta.customValues.[property] and [character].extras.[property])
|
||||
- Custom Properties in Meta AND Character (Editable in Charter and Character Editor :D) (accessible with SONG.meta.customValues.[property] and [character].extras.[property])
|
||||
- SMALLER BUT STILL COOL
|
||||
- Multiple Icons now show up on strumlines with multiple characters in the charter
|
||||
- Note hoverer to show where your note is going to be placed
|
||||
@@ -63,7 +63,7 @@
|
||||
- Fix for pressing F5 in an editor breaking it
|
||||
- Fix when getting GitHub data and a redirect happens
|
||||
- Fix for healthbar incorrectly colored in opponent mode
|
||||
- Video cutscenes are ALOT more stable (thanks majigsaw :D)
|
||||
- Video cutscenes are A LOT more stable (thanks majigsaw :D)
|
||||
- 3D now works again (so cool i love away3d in 2024)
|
||||
- Lots and lots of grammar and wording fixes (so true bro -lunar)
|
||||
- Lots and lots of other optimizations made
|
||||
@@ -76,5 +76,5 @@
|
||||
- Some other shit idk ill add it whenever someone tells me backward compat is broke 💔
|
||||
</details>
|
||||
|
||||
thanks so much for the support and always being there, it really does mean alot to us < 3
|
||||
thanks so much for the support and always being there, it really does mean a lot to us < 3
|
||||
we are one step closer to turning beta so we really can't wait !
|
||||
@@ -11,7 +11,7 @@ Also, the command `.\cne test` uses the source assets folder instead of the expo
|
||||
|
||||
## Codename Engine
|
||||
|
||||
Codename Engine is a new Friday Night Funkin' Engine aimed at simplifying modding, along with extensiblity and ease of use.<br>
|
||||
Codename Engine is a new Friday Night Funkin' Engine aimed at simplifying modding, along with extensibility and ease of use.<br>
|
||||
### Before making issues or need help with something, check our website [HERE](https://fnf-cne-devs.github.io/) (it contains a wiki of how to mod with EXAMPLES, an api, lists of mods made with Codename Engine and more)!!!
|
||||
#### The Engine includes many new features, as seen [here](FEATURES.md)<br>
|
||||
#### Wanna see the new features added in the most recent update? Click [here](PATCHNOTES.md)<br>
|
||||
@@ -70,7 +70,7 @@ If you don't have a github account please go onto https://fnf-cne-devs.github.io
|
||||
- Mod and fork the engine (without using it for illicit purposes)
|
||||
- Contribute to the engine (for example through *Pull Requests*, *Issues*, etc)
|
||||
- Create a sub engine with Codename Engine as **TEMPLATE** with **CREDITS** (for example leaving the *credits menu submenu with the GitHub contributors* and putting the *[main devs](https://github.com/FNF-CNE-Devs)* in a *README* specifying that it's a *sub engine from Codename Engine*)
|
||||
- Release excutable mods that use Codename Engine as source (Specifing that uses Codename Engine by for example the same way written above this)
|
||||
- Release executable mods that use Codename Engine as source (Specifying that uses Codename Engine by for example the same way written above this)
|
||||
- Release modpacks
|
||||
|
||||
### You can't:
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
- [ ] BPM Changes Events
|
||||
- [ ] Character Editor
|
||||
- [x] Animation Editing
|
||||
- [x] Animation Deletion/Creationg
|
||||
- [x] Animation Deletion/Creation
|
||||
- [x] Character Info Editing
|
||||
- [x] Character Saving
|
||||
- [x] Add Undos to Actions
|
||||
@@ -49,7 +49,7 @@
|
||||
- [ ] Fix bugs
|
||||
|
||||
## `v1.1.0`
|
||||
- [ ] Charter Waveforms (maybe in v1.1.0, dont wanna slow shit down)
|
||||
- [ ] Charter Waveforms (maybe in v1.1.0, don't wanna slow shit down)
|
||||
- [ ] Custom classes
|
||||
- [ ] Proper super overrides (FlxText_HSX doesn't allow overrides for update because of this)
|
||||
- [ ] Custom Class extending Custom Classes
|
||||
|
||||
@@ -7,7 +7,7 @@ function postCreate() {
|
||||
}
|
||||
|
||||
var toAdd:Bool = true; // Using this just to make sure
|
||||
function update(elpased) {
|
||||
function update(elapsed) {
|
||||
if(toAdd) {
|
||||
toAdd = false;
|
||||
PlayState.instance.insert(PlayState.instance.members.indexOf(self), trail);
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
var loopedTimah:FlxTimer; // Hey! a man has fallen into the river in lego city! and if youre asking why this is here, you shall disappear! - Nex
|
||||
var loopedTimer:FlxTimer; // Hey! a man has fallen into the river in lego city! and if youre asking why this is here, you shall disappear! - Nex
|
||||
var bgFade:FlxSprite;
|
||||
var hand:FlxSprite;
|
||||
|
||||
@@ -9,7 +9,7 @@ function postCreate() {
|
||||
bgFade.alpha = 0;
|
||||
cutscene.insert(0, bgFade);
|
||||
|
||||
loopedTimah = new FlxTimer().start(0.83, function(tmr:FlxTimer)
|
||||
loopedTimer = new FlxTimer().start(0.83, function(tmr:FlxTimer)
|
||||
{
|
||||
bgFade.alpha += (1 / 5) * 0.7;
|
||||
if (bgFade.alpha > 0.7)
|
||||
@@ -30,8 +30,8 @@ function close(event) {
|
||||
cutscene.curMusic?.fadeOut(1, 0);
|
||||
for(c in cutscene.charMap) c.visible = false;
|
||||
|
||||
loopedTimah.cancel();
|
||||
loopedTimah = new FlxTimer().start(0.2, function(tmr:FlxTimer)
|
||||
loopedTimer.cancel();
|
||||
loopedTimer = new FlxTimer().start(0.2, function(tmr:FlxTimer)
|
||||
{
|
||||
if (tmr.elapsedLoops <= 5) {
|
||||
cutscene.dialogueBox.alpha -= 1 / 5;
|
||||
|
||||
@@ -11,7 +11,7 @@ function create() {
|
||||
}
|
||||
|
||||
var adder:Int = 0;
|
||||
function postUpdate(elapsed:Float) { // Doing it like this so at least the red bump doesnt look too much instant
|
||||
function postUpdate(elapsed:Float) { // Doing it like this so at least the red bump doesn't look too much instant
|
||||
var toAdd:Int = lerp(adder, 0, elapsed);
|
||||
idk.amount = camGame.zoom * camHUD.zoom + toAdd;
|
||||
idk.strength = (camGame.zoom - camHUD.zoom + toAdd) * 5;
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
antialiasing="false" scale="4.797" scroll="0.9" updateHitbox="true" type="loop"/>
|
||||
|
||||
<sprite name="bgTrees" x="-590" y="-800" sprite="weebTrees" antialiasing="false" scale="5.102" scroll="0.85" updateHitbox="true" type="loop">
|
||||
<!-- Frame 19 isnt used in og -->
|
||||
<!-- Frame 19 isn't used in og -->
|
||||
<anim name="trees" anim="trees" indices="0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19" fps="12" loop="true"/>
|
||||
</sprite>
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ public function lightningStrikeShit():Void
|
||||
lightningStrikeBeat = curBeat;
|
||||
lightningOffset = FlxG.random.int(8, 24);
|
||||
|
||||
boyfriend.playAnim('scared', true, "SING"); // SING so that they dont get indefinitely looped
|
||||
boyfriend.playAnim('scared', true, "SING"); // SING so that they don't get indefinitely looped
|
||||
gf.playAnim('scared', true, "SING");
|
||||
}
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
<dad x="20" y="160"/>
|
||||
<boyfriend x="810"/>
|
||||
|
||||
<!-- FOREGROUND TANKMANS -->
|
||||
<!-- FOREGROUND TANKMENs -->
|
||||
|
||||
<high-memory>
|
||||
<sprite name="tank0" x="-500" y="650" sprite="tank0" scrollx="1.7" scrolly="1.5" type="onbeat" zoomfactor="1.25"/>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# THIS FILE ISNT NECESSARY,
|
||||
# THIS FILE ISN'T NECESSARY,
|
||||
# BUT YOU CAN USE IT TO SORT WEEKS
|
||||
|
||||
tutorial
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
## Here are guides on common mistakes and advices for writting shaders for flixel and openfl.
|
||||
## Here are guides on common mistakes and advices for writing shaders for flixel and openfl.
|
||||
|
||||
It's important to follow this guide as most shader coders make these mistakes a lot and end up with shaders that only work on certain devices.
|
||||
|
||||
@@ -51,7 +51,7 @@ We will show each step to converting this shader into an usable openfl/flixel sh
|
||||
|
||||
1. replace ``void mainImage( out vec4 fragColor, in vec2 fragCoord )`` with a simple ``void main()`` (flixel and openfl do not have any parameters since the coords are defined outside the function)
|
||||
2. replace ``vec2 uv = fragCoord/iResolution.xy;`` with ``vec2 uv = openfl_TextureCoordv`` (or in some cases, add ``vec2 fragCoord = openfl_TextureCoordv*openfl_TextureSize.xy`` before it and replace `iResolution.xy` with ``openfl_TextureSize.xy`` (if the uv value is different than usual))
|
||||
3. replace ``vec4 col = texture(iChannel0, uv);`` with ``vec4 col = texture2D(bitmap, uv);`` or ``vec4 col = flixel_texture2D(bitmap, uv);`` (keep in mind bitmap is the pixels of the camera/sprite the shader is aplied to)
|
||||
3. replace ``vec4 col = texture(iChannel0, uv);`` with ``vec4 col = texture2D(bitmap, uv);`` or ``vec4 col = flixel_texture2D(bitmap, uv);`` (keep in mind bitmap is the pixels of the camera/sprite the shader is applied to)
|
||||
4. finally, replace ``fragColor = col;`` with ``gl_FragColor = col;``
|
||||
|
||||
###### Keep in mind that this covers the most basic on how to convert a shader from shadertoy.com, complex shaders will need more expertise with handling shaders before converting those.
|
||||
|
||||
@@ -5,8 +5,8 @@
|
||||
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);
|
||||
|
||||
const vec4 outlinecolor = vec4(0.1);
|
||||
const vec3 lowdetailcol = vec3(0.0, 0.0, 1.0);
|
||||
const vec4 outlineColor = vec4(0.1);
|
||||
const vec3 lowDetailCol = vec3(0.0, 0.0, 1.0);
|
||||
|
||||
uniform vec2 textureRes;
|
||||
uniform float pixelOffset;
|
||||
@@ -21,7 +21,7 @@ uniform bool lowDetail;
|
||||
float getAmplitude(vec2 pixel) {
|
||||
float pixelID = floor((pixel.y+pixelOffset)/3.0);
|
||||
|
||||
// TODO: INVESTIGATE THE 1.+ AND WHY IT WORKS (SRSLY I GOT NO CLUE) -lunar
|
||||
// TODO: INVESTIGATE THE 1.+ AND WHY IT WORKS (SERIOUSLY I GOT NO CLUE) -lunar
|
||||
vec2 wavePixel = vec2(mod(pixelID, waveformSize.x), 1.0+floor(pixelID/waveformSize.x));
|
||||
vec4 waveData = texture2D(waveformTexture, wavePixel / waveformSize);
|
||||
|
||||
@@ -41,28 +41,28 @@ bool inWaveForm(vec2 pixel, float width) {
|
||||
return pixel.x > widthdiv2 && pixel.x < textureRes.x-widthdiv2;
|
||||
}
|
||||
|
||||
float getHightlight(float ampwidth) {
|
||||
float remapCoord = (ampwidth/textureRes.x)/2.0;
|
||||
float getHighlight(float ampWidth) {
|
||||
float remapCoord = (ampWidth/textureRes.x)/2.0;
|
||||
float mappedCoord = map(openfl_TextureCoordv.x, remapCoord, 1.0-remapCoord, 0.0, 1.0);
|
||||
return 1.0-(abs(mappedCoord-0.5)*2.0);
|
||||
}
|
||||
|
||||
void outlineWaveform(vec2 pixel, vec2 offset) {
|
||||
float amplitude = getAmplitude(pixel - offset);
|
||||
float ampwidth = (1.0-amplitude) * textureRes.x;
|
||||
float ampWidth = (1.0-amplitude) * textureRes.x;
|
||||
|
||||
if (!inWaveForm(pixel, ampwidth))
|
||||
gl_FragColor -= outlinecolor*mix(0.5, 0.8, amplitude);
|
||||
if (!inWaveForm(pixel, ampWidth))
|
||||
gl_FragColor -= outlineColor*mix(0.5, 0.8, amplitude);
|
||||
}
|
||||
|
||||
void highDetailWaveform(vec2 pixel, float amplitude, float ampwidth) {
|
||||
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));
|
||||
gradientColor = mix(gradientColor, gradientColor * vec3(1.8), map(getHighlight(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));
|
||||
float ampWidthHighlight = getAmpWidth(amplitude/3.0);
|
||||
if (inWaveForm(pixel, ampWidthHighlight))
|
||||
gradientColor = mix(gradientColor, gradientColor * vec3(1.8), map(getHighlight(ampWidthHighlight), 0.0, 1.0, 0.5, 1.0));
|
||||
|
||||
gl_FragColor = vec4(vec3(gradientColor * mix(0.5, 0.8, amplitude))*openfl_Alphav, openfl_Alphav);
|
||||
|
||||
@@ -70,19 +70,19 @@ void highDetailWaveform(vec2 pixel, float amplitude, float ampwidth) {
|
||||
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 lowDetailWaveform(vec2 pixel, float amplitude, float ampWidth) {
|
||||
gl_FragColor = vec4(lowDetailCol * (pixel.y+pixelOffset>playerPosition ? 0.7 : 1.0), 1.0);
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
vec2 pixel = openfl_TextureCoordv * textureRes;
|
||||
float amplitude = getAmplitude(pixel);
|
||||
float ampwidth = getAmpWidth(amplitude);
|
||||
float ampWidth = getAmpWidth(amplitude);
|
||||
|
||||
gl_FragColor = vec4(0.0);
|
||||
if (!inWaveForm(pixel, ampwidth)) return;
|
||||
if (!inWaveForm(pixel, ampWidth)) return;
|
||||
|
||||
if (lowDetail) lowDetailWaveform(pixel, amplitude, ampwidth);
|
||||
else highDetailWaveform(pixel, amplitude, ampwidth);
|
||||
if (lowDetail) lowDetailWaveform(pixel, amplitude, ampWidth);
|
||||
else highDetailWaveform(pixel, amplitude, ampWidth);
|
||||
}
|
||||
+3
-3
@@ -41,7 +41,7 @@ class Main {
|
||||
dDoc: [
|
||||
"Usage: test <optional args>",
|
||||
"",
|
||||
"This will create a quick debug build binded to the source then run it, which means:",
|
||||
"This will create a quick debug build connected to the source then run it, which means:",
|
||||
"- The assets WON'T be copied over - Assets will be read from the game's source.",
|
||||
"- This build WON'T be ready for release - Running anywhere else than in the bin folder will result in a crash from missing assets",
|
||||
"- This build will also use the mods folder from the source directory.",
|
||||
@@ -59,7 +59,7 @@ class Main {
|
||||
dDoc: [
|
||||
"Usage: build <optional arguments>",
|
||||
"",
|
||||
"This will create a quick debug build binded to the source then run it, which means:",
|
||||
"This will create a quick debug build connected to the source then run it, which means:",
|
||||
"- The assets WON'T be copied over - Assets will be read from the game's source.",
|
||||
"- This build WON'T be ready for release - Running anywhere else than in the bin folder will result in a crash from missing assets",
|
||||
"- This build will also use the mods folder from the source directory.",
|
||||
@@ -103,7 +103,7 @@ class Main {
|
||||
"",
|
||||
"This will optimize a JSON file, which means it will remove all unnecessary spacing from the file.",
|
||||
"WARNING: Order might be lost.",
|
||||
"WARNING: Comments arent supported.",
|
||||
"WARNING: Comments aren't supported.",
|
||||
"",
|
||||
"-O | --no-old : No Old file will be created.",
|
||||
].join("\n")
|
||||
|
||||
+1
-1
@@ -133,7 +133,7 @@
|
||||
<!-- Comment this out to disable support for custom ndlls. !-->
|
||||
<haxedef name="NDLLS_SUPPORTED" unless="web || iphonesim || hl" />
|
||||
|
||||
<!-- Comment this out to disable support for Away3D Flixel Intergration (reduces compile times) !-->
|
||||
<!-- Comment this out to disable support for Away3D Flixel Integration (reduces compile times) !-->
|
||||
<define name="THREE_D_SUPPORT" />
|
||||
|
||||
<!-- Comment this out to disable support for Funkin Audio Visualizer (reduces compile times) !-->
|
||||
|
||||
+1
-1
@@ -363,7 +363,7 @@ class Xml {
|
||||
|
||||
/**
|
||||
Removes a child from the Document or Element.
|
||||
Returns true if the child was successfuly removed.
|
||||
Returns true if the child was successfully removed.
|
||||
**/
|
||||
public function removeChild(x:Xml):Bool {
|
||||
ensureElementType();
|
||||
|
||||
@@ -7,7 +7,7 @@ import flixel.FlxG;
|
||||
#end
|
||||
|
||||
/**
|
||||
* @author lunarclient
|
||||
* @author lunarcleint
|
||||
* @see https://twitter.com/lunarcleint
|
||||
*
|
||||
* Help from Ne_Eo
|
||||
|
||||
@@ -28,7 +28,7 @@ class FlxAnimate extends flxanimate.FlxAnimate {
|
||||
var angleOff = (frameOffsetAngle - angle) * FlxAngle.TO_RAD;
|
||||
var cos = Math.cos(angleOff);
|
||||
var sin = Math.sin(angleOff);
|
||||
// cos doesnt need to be negated
|
||||
// cos doesn't need to be negated
|
||||
rMatrix.rotateWithTrig(cos, -sin);
|
||||
rMatrix.translate(-frameOffset.x, -frameOffset.y);
|
||||
rMatrix.rotateWithTrig(cos, sin);
|
||||
@@ -72,7 +72,7 @@ class FlxAnimate extends flxanimate.FlxAnimate {
|
||||
#end
|
||||
}
|
||||
|
||||
// doesnt work, needs to be remade
|
||||
// doesn't work, needs to be remade
|
||||
// #if FLX_DEBUG
|
||||
// if (FlxG.debugger.drawDebug)
|
||||
// drawDebug();
|
||||
@@ -81,7 +81,7 @@ class FlxAnimate extends flxanimate.FlxAnimate {
|
||||
|
||||
override function limbOnScreen(limb:FlxFrame, m:FlxMatrix, ?Camera:FlxCamera)
|
||||
{
|
||||
// TODO: ACTUAL OPTIMISATION
|
||||
// TODO: ACTUAL OPTIMIZATION
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -49,7 +49,8 @@ class FunkinSprite extends FlxSkewedSprite implements IBeatReceiver implements I
|
||||
public var globalCurFrame(get, set):Int;
|
||||
|
||||
/**
|
||||
* ODD interval -> asynced; EVEN interval -> synced
|
||||
* ODD interval -> not aligned to beats
|
||||
* EVEN interval -> aligned to beats
|
||||
*/
|
||||
public var beatInterval(default, set):Int = 2;
|
||||
public var beatOffset:Int = 0;
|
||||
|
||||
@@ -17,7 +17,7 @@ class MusicBeatSubstate extends FlxSubState implements IBeatReceiver
|
||||
private var lastStep:Float = 0;
|
||||
|
||||
/**
|
||||
* Whether this specifc substate can open custom transitions
|
||||
* Whether this specific substate can open custom transitions
|
||||
*/
|
||||
public var canOpenCustomTransition:Bool = false;
|
||||
/**
|
||||
|
||||
@@ -42,8 +42,9 @@ class ModsFolder {
|
||||
* Whenever its the first time mods has been reloaded.
|
||||
*/
|
||||
private static var __firstTime:Bool = true;
|
||||
|
||||
/**
|
||||
* Initialises `mods` folder.
|
||||
* Initializes `mods` folder.
|
||||
*/
|
||||
public static function init() {
|
||||
if(!getModsList().contains(Options.lastLoadedMod))
|
||||
|
||||
@@ -15,9 +15,9 @@ class BaseGameParser {
|
||||
|
||||
result.customValues = {};
|
||||
result.customValues.timeChanges = data.timeChanges;
|
||||
var firstTimeChng:SwagTimeChange = data.timeChanges[0];
|
||||
result.bpm = firstTimeChng.bpm;
|
||||
result.beatsPerMeasure = firstTimeChng.b != null ? firstTimeChng.b : Flags.DEFAULT_BEATS_PER_MEASURE;
|
||||
var firstTimeChange:SwagTimeChange = data.timeChanges[0];
|
||||
result.bpm = firstTimeChange.bpm;
|
||||
result.beatsPerMeasure = firstTimeChange.b != null ? firstTimeChange.b : Flags.DEFAULT_BEATS_PER_MEASURE;
|
||||
|
||||
result.difficulties = data.playData.difficulties.concat(data.playData.songVariations);
|
||||
Reflect.deleteField(data.playData, "difficulties");
|
||||
|
||||
@@ -55,7 +55,7 @@ class Chart {
|
||||
}
|
||||
|
||||
public static function detectChartFormat(data:Dynamic):ChartFormat {
|
||||
var __temp:Dynamic; // imma reuse this var so the program doesnt have to get values multiple times - Nex
|
||||
var __temp:Dynamic; // imma reuse this var so the program doesn't have to get values multiple times - Nex
|
||||
|
||||
if ((__temp = data.codenameChart) == true || __temp == "true")
|
||||
return CODENAME;
|
||||
|
||||
@@ -44,7 +44,7 @@ typedef ChartStrumLine = {
|
||||
var ?scrollSpeed:Float;
|
||||
var ?vocalsSuffix:String;
|
||||
|
||||
var ?strumLinePos:Float; // Backwards compatability
|
||||
var ?strumLinePos:Float; // Backwards compatibility
|
||||
}
|
||||
|
||||
typedef ChartNote = {
|
||||
|
||||
@@ -106,7 +106,7 @@ class PsychParser {
|
||||
var eventStep:Float = Conductor.getStepForTime(event.time);
|
||||
psychEvents.push([
|
||||
"Change Scroll Speed",
|
||||
FlxMath.roundDecimal(event.params[1]/chart.scrollSpeed, 2), // SCROLL SPEED MULTIPLER
|
||||
FlxMath.roundDecimal(event.params[1]/chart.scrollSpeed, 2), // SCROLL SPEED MULTIPLIER
|
||||
FlxMath.roundDecimal( // TIME
|
||||
event.params[0] ? // IS TWEENED?
|
||||
(Conductor.getTimeForStep(eventStep+event.params[2]) - Conductor.getTimeForStep(eventStep))/1000
|
||||
|
||||
@@ -4,7 +4,7 @@ import flixel.FlxState;
|
||||
import funkin.backend.scripting.events.*;
|
||||
|
||||
class EventManager {
|
||||
// map doesnt work for that
|
||||
// map doesn't work for that
|
||||
public static var eventValues:Array<CancellableEvent> = [];
|
||||
public static var eventKeys:Array<Class<CancellableEvent>> = [];
|
||||
|
||||
|
||||
@@ -11,11 +11,11 @@ import funkin.backend.system.Conductor;
|
||||
class GlobalScript {
|
||||
public static var scripts:ScriptPack;
|
||||
|
||||
private static var initalized:Bool = false;
|
||||
private static var initialized:Bool = false;
|
||||
|
||||
public static function init() {
|
||||
if(initalized) return;
|
||||
initalized = true;
|
||||
if(initialized) return;
|
||||
initialized = true;
|
||||
#if MOD_SUPPORT
|
||||
ModsFolder.onModSwitch.add(onModSwitch);
|
||||
#end
|
||||
|
||||
@@ -16,7 +16,7 @@ class HScript extends Script {
|
||||
public static function initParser() {
|
||||
var parser = new Parser();
|
||||
parser.allowJSON = parser.allowMetadata = parser.allowTypes = true;
|
||||
parser.preprocesorValues = Script.getDefaultPreprocessors();
|
||||
parser.preprocessorValues = Script.getDefaultPreprocessors();
|
||||
return parser;
|
||||
}
|
||||
|
||||
|
||||
@@ -307,7 +307,7 @@ class Script extends FlxBasic implements IFlxDestroyable {
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads the code from a string, doesnt really work after the script has been loaded
|
||||
* Loads the code from a string, doesn't really work after the script has been loaded
|
||||
* @param code The code.
|
||||
*/
|
||||
public function loadFromString(code:String) {
|
||||
|
||||
@@ -2,11 +2,11 @@ package funkin.backend.scripting.events.menu.freeplay;
|
||||
|
||||
final class FreeplayAlphaUpdateEvent extends CancellableEvent {
|
||||
/**
|
||||
* The alpha when nothing is playing and isnt selected
|
||||
* The alpha when nothing is playing and isn't selected
|
||||
*/
|
||||
public var idleAlpha:Float;
|
||||
/**
|
||||
* The alpha when something is playing and isnt selected
|
||||
* The alpha when something is playing and isn't selected
|
||||
*/
|
||||
public var idlePlayingAlpha:Float;
|
||||
/**
|
||||
|
||||
@@ -86,7 +86,7 @@ final class NoteHitEvent extends CancellableEvent {
|
||||
*/
|
||||
public var healthGain:Float;
|
||||
/**
|
||||
* Rating name. Defaults to "sick", "good", "bad" and "shit". Customisable.
|
||||
* Rating name. Defaults to "sick", "good", "bad" and "shit". Customizable.
|
||||
*/
|
||||
public var rating:String = "sick";
|
||||
/**
|
||||
|
||||
@@ -532,7 +532,7 @@ class FunkinShader extends FlxShader implements IHScriptCustomBehaviour {
|
||||
|
||||
// cant do "field is ShaderInput" because ShaderInput has the @:generic metadata
|
||||
// aka instead of ShaderInput<Float> it gets built as ShaderInput_Float
|
||||
// this should be fine tho because we check the class, and the fields dont vary based on the type
|
||||
// this should be fine tho because we check the class, and the fields don't vary based on the type
|
||||
|
||||
// thanks for looking in the code cne fans :D!! -lunar
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@ class Conductor
|
||||
public static var stepCrochet:Float = crochet / 4; // steps in milliseconds
|
||||
|
||||
/**
|
||||
* Number of beats per mesure (top number in time signature). Defaults to 4.
|
||||
* Number of beats per measure (top number in time signature). Defaults to 4.
|
||||
*/
|
||||
public static var beatsPerMeasure:Float = 4;
|
||||
|
||||
@@ -190,7 +190,7 @@ class Conductor
|
||||
__updateSongPos(FlxG.elapsed);
|
||||
|
||||
if (bpm > 0) {
|
||||
// updates curbeat and stuff
|
||||
// updates curBeat and stuff
|
||||
__lastChange = {
|
||||
stepTime: 0,
|
||||
songTime: 0,
|
||||
|
||||
@@ -76,7 +76,7 @@ class Flags {
|
||||
public static var DEFAULT_OPPONENT_MODE_ALLOWED:Bool = false;
|
||||
|
||||
@:also(funkin.game.PlayState.coopMode)
|
||||
public static var DEFAULT_COOP_MODE:Bool = false; // used in playstate if it doesnt find it
|
||||
public static var DEFAULT_COOP_MODE:Bool = false; // used in playstate if it doesn't find it
|
||||
@:also(funkin.game.PlayState.opponentMode)
|
||||
public static var DEFAULT_OPPONENT_MODE:Bool = false;
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ package funkin.backend.system;
|
||||
import flixel.graphics.FlxGraphic;
|
||||
|
||||
/**
|
||||
* Dummy FlxSprite that allows you to cache FlxGraphics, and immediatly send them to GPU memory.
|
||||
* Dummy FlxSprite that allows you to cache FlxGraphics, and immediately send them to GPU memory.
|
||||
*/
|
||||
class GraphicCacheSprite extends FlxSprite {
|
||||
/**
|
||||
|
||||
@@ -31,7 +31,7 @@ class Logs {
|
||||
var prefix = "[FLIXEL]";
|
||||
var color:ConsoleColor = LIGHTGRAY;
|
||||
var level:Level = INFO;
|
||||
if (style == LogStyle.CONSOLE) // cant place a switch here as these arent inline values - Nex
|
||||
if (style == LogStyle.CONSOLE) // cant place a switch here as these aren't inline values - Nex
|
||||
{
|
||||
prefix = "> ";
|
||||
color = WHITE;
|
||||
|
||||
@@ -202,8 +202,8 @@ class Main extends Sprite
|
||||
}
|
||||
|
||||
private static function onStateSwitchPost() {
|
||||
// manual asset clearing since base openfl one doesnt clear lime one
|
||||
// doesnt clear bitmaps since flixel fork does it auto
|
||||
// manual asset clearing since base openfl one does'nt clear lime one
|
||||
// does'nt clear bitmaps since flixel fork does it auto
|
||||
|
||||
@:privateAccess {
|
||||
// clear uint8 pools
|
||||
|
||||
@@ -126,7 +126,7 @@ class Framerate extends Sprite {
|
||||
bgSprite.scaleY = height;
|
||||
|
||||
var selectable = debugMode == 2;
|
||||
{ // idk i tried to make it more lookable:sob: - Nex
|
||||
{ // idk i tried to make it more readable:sob: - Nex
|
||||
memoryCounter.memoryText.selectable = memoryCounter.memoryPeakText.selectable =
|
||||
fpsCounter.fpsNum.selectable = fpsCounter.fpsLabel.selectable =
|
||||
#if SHOW_BUILD_ON_FPS codenameBuildField.selectable = #end selectable;
|
||||
|
||||
@@ -63,7 +63,7 @@ class SystemInfo extends FramerateCategory {
|
||||
|
||||
cpuName = process.stdout.readAll().toString().trim().split("\n")[1].trim();
|
||||
#elseif mac
|
||||
var process = new HiddenProcess("sysctl -a | grep brand_string"); // Somehow this isnt able to use the args but it still works
|
||||
var process = new HiddenProcess("sysctl -a | grep brand_string"); // Somehow this isn't able to use the args but it still works
|
||||
if (process.exitCode() != 0) throw 'Could not fetch CPU information';
|
||||
|
||||
cpuName = process.stdout.readAll().toString().trim().split(":")[1].trim();
|
||||
|
||||
@@ -78,9 +78,9 @@ class ControlsMacro
|
||||
});
|
||||
|
||||
function buildBindControl(s:String, prefix:String) {
|
||||
var prefixxed = prefix + s;
|
||||
var prefixed = prefix + s;
|
||||
|
||||
return macro bindKeys(Control.$s, Options.$prefixxed);
|
||||
return macro bindKeys(Control.$s, Options.$prefixed);
|
||||
}
|
||||
|
||||
fields.push({
|
||||
|
||||
@@ -184,7 +184,7 @@ class FlagMacro {
|
||||
}
|
||||
|
||||
case TPath({name: "Array", pack: []}):
|
||||
Context.error("Flag " + field.name + " cannot be an Array that isnt a String or Bool or TrimmedString or Int or Float", field.pos);
|
||||
Context.error("Flag " + field.name + " cannot be an Array that isn't a String or Bool or TrimmedString or Int or Float", field.pos);
|
||||
case TPath({name: "Map", pack: []}):
|
||||
Context.error("Flag " + field.name + " cannot be a Map<K, V>", field.pos);
|
||||
default:
|
||||
|
||||
@@ -81,8 +81,8 @@ class HashLinkFixer {
|
||||
var returns:Bool = !fun.ret.match(TPath({name: "Void"}));
|
||||
|
||||
var printer = new haxe.macro.Printer();
|
||||
if(cl.module == "hl.Gc" && fun.ret == null) returns = false; // fix since they dont explicitly set :Void
|
||||
if(cl.module == "hl.Format" && fun.ret == null) returns = false; // fix since they dont explicitly set :Void
|
||||
if(cl.module == "hl.Gc" && fun.ret == null) returns = false; // fix since they don't explicitly set :Void
|
||||
if(cl.module == "hl.Format" && fun.ret == null) returns = false; // fix since they don't explicitly set :Void
|
||||
|
||||
var name = 'hlf_${f.name}';
|
||||
|
||||
@@ -114,7 +114,7 @@ class HashLinkFixer {
|
||||
default:
|
||||
}
|
||||
|
||||
var fiel:Field = {
|
||||
var field:Field = {
|
||||
name: name,
|
||||
pos: Context.currentPos(),
|
||||
kind: FFun({
|
||||
@@ -126,7 +126,7 @@ class HashLinkFixer {
|
||||
access: f.access.copy().filter(function(a) return a != APublic && a != APrivate).concat([APrivate]),
|
||||
meta: meta
|
||||
};
|
||||
fields.push(fiel);
|
||||
fields.push(field);
|
||||
definedFields.push(f.name);
|
||||
|
||||
// Remove meta from original function
|
||||
|
||||
@@ -6,7 +6,7 @@ import funkin.backend.utils.NativeAPI;
|
||||
import lime.media.AudioManager;
|
||||
|
||||
/**
|
||||
* if youre stealing this keep this comment at least please lol
|
||||
* if you are stealing this keep this comment at least please lol
|
||||
*
|
||||
* hi gray itsa me yoshicrafter29 i fixed it hehe
|
||||
*/
|
||||
|
||||
@@ -117,14 +117,14 @@ class CoolUtil
|
||||
* Gets file attributes from a file or a folder adding eventual missing folders in the path
|
||||
* (WARNING: Only works on `windows` for now. On other platforms the attributes' value it's always going to be `0` -thanks to the wrapper you can also use `isNothing` for checking- but still creates eventual missing folders if the platforms allows it to).
|
||||
* @param path Path to the file or folder
|
||||
* @param useAbsol If it should use the absolute path (By default it's `true` but if it's `false` you can use files outside from this program's directory for example)
|
||||
* @param useAbsolute If it should use the absolute path (By default it's `true` but if it's `false` you can use files outside from this program's directory for example)
|
||||
* @return The attributes through the `FileAttributeWrapper`
|
||||
*/
|
||||
@:noUsing public static inline function safeGetAttributes(path:String, useAbsol:Bool = true):FileAttributeWrapper {
|
||||
@:noUsing public static inline function safeGetAttributes(path:String, useAbsolute:Bool = true):FileAttributeWrapper {
|
||||
#if sys
|
||||
addMissingFolders(Path.directory(path));
|
||||
|
||||
var result = NativeAPI.getFileAttributes(path, useAbsol);
|
||||
var result = NativeAPI.getFileAttributes(path, useAbsolute);
|
||||
if(result.isNothing) Logs.trace('The file where it has been tried to get the attributes from, might be corrupted or inexistent (code: ${result.getValue()})', WARNING);
|
||||
return result;
|
||||
#else
|
||||
@@ -137,15 +137,15 @@ class CoolUtil
|
||||
* (WARNING: Only works on `windows` for now. On other platforms the return code it's always going to be `0` but still creates eventual missing folders if the platforms allows it to).
|
||||
* @param path Path to the file or folder
|
||||
* @param attrib The attribute(s) to set (WARNING: There are some non settable attributes, such as the `COMPRESSED` one)
|
||||
* @param useAbsol If it should use the absolute path (By default it's `true` but if it's `false` you can use files outside from this program's directory for example)
|
||||
* @param useAbsolute If it should use the absolute path (By default it's `true` but if it's `false` you can use files outside from this program's directory for example)
|
||||
* @return The result code: `0` means that it failed setting
|
||||
*/
|
||||
@:noUsing public static inline function safeSetAttributes(path:String, attrib:OneOfThree<NativeAPI.FileAttribute, FileAttributeWrapper, Int>, useAbsol:Bool = true):Int {
|
||||
@:noUsing public static inline function safeSetAttributes(path:String, attrib:OneOfThree<NativeAPI.FileAttribute, FileAttributeWrapper, Int>, useAbsolute:Bool = true):Int {
|
||||
// yes, i'm aware that FileAttribute is also an Int so need to include it too, but at least like this we don't have to make cast sometimes while passing the arguments - Nex
|
||||
#if sys
|
||||
addMissingFolders(Path.directory(path));
|
||||
|
||||
var result = NativeAPI.setFileAttributes(path, attrib, useAbsol);
|
||||
var result = NativeAPI.setFileAttributes(path, attrib, useAbsolute);
|
||||
if(result == 0) Logs.trace('Failed to set attributes to $path with a code of: $result', WARNING);
|
||||
return result;
|
||||
#else
|
||||
@@ -158,14 +158,14 @@ class CoolUtil
|
||||
* (WARNING: Only works on `windows` for now. On other platforms the return code it's always going to be `0` but still creates eventual missing folders if the platforms allows it to).
|
||||
* @param path Path to the file or folder
|
||||
* @param attrib The attribute(s) to add (WARNING: There are some non settable attributes, such as the `COMPRESSED` one)
|
||||
* @param useAbsol If it should use the absolute path (By default it's `true` but if it's `false` you can use files outside from this program's directory for example)
|
||||
* @param useAbsolute If it should use the absolute path (By default it's `true` but if it's `false` you can use files outside from this program's directory for example)
|
||||
* @return The result code: `0` means that it failed setting
|
||||
*/
|
||||
@:noUsing public static inline function safeAddAttributes(path:String, attrib:OneOfTwo<NativeAPI.FileAttribute, Int>, useAbsol:Bool = true):Int {
|
||||
@:noUsing public static inline function safeAddAttributes(path:String, attrib:OneOfTwo<NativeAPI.FileAttribute, Int>, useAbsolute:Bool = true):Int {
|
||||
#if sys
|
||||
addMissingFolders(Path.directory(path));
|
||||
|
||||
var result = NativeAPI.addFileAttributes(path, attrib, useAbsol);
|
||||
var result = NativeAPI.addFileAttributes(path, attrib, useAbsolute);
|
||||
if(result == 0) Logs.trace('Failed to add attributes to $path with a code of: $result', WARNING);
|
||||
return result;
|
||||
#else
|
||||
@@ -178,14 +178,14 @@ class CoolUtil
|
||||
* (WARNING: Only works on `windows` for now. On other platforms the return code it's always going to be `0` but still creates eventual missing folders if the platforms allows it to).
|
||||
* @param path Path to the file or folder
|
||||
* @param attrib The attribute(s) to remove (WARNING: There are some non settable attributes, such as the `COMPRESSED` one)
|
||||
* @param useAbsol If it should use the absolute path (By default it's `true` but if it's `false` you can use files outside from this program's directory for example)
|
||||
* @param useAbsolute If it should use the absolute path (By default it's `true` but if it's `false` you can use files outside from this program's directory for example)
|
||||
* @return The result code: `0` means that it failed setting
|
||||
*/
|
||||
@:noUsing public static inline function safeRemoveAttributes(path:String, attrib:OneOfTwo<NativeAPI.FileAttribute, Int>, useAbsol:Bool = true):Int {
|
||||
@:noUsing public static inline function safeRemoveAttributes(path:String, attrib:OneOfTwo<NativeAPI.FileAttribute, Int>, useAbsolute:Bool = true):Int {
|
||||
#if sys
|
||||
addMissingFolders(Path.directory(path));
|
||||
|
||||
var result = NativeAPI.removeFileAttributes(path, attrib, useAbsol);
|
||||
var result = NativeAPI.removeFileAttributes(path, attrib, useAbsolute);
|
||||
if(result == 0) Logs.trace('Failed to remove attributes to $path with a code of: $result', WARNING);
|
||||
return result;
|
||||
#else
|
||||
@@ -426,7 +426,7 @@ class CoolUtil
|
||||
var beatsPerMeasure:Float = Flags.DEFAULT_BEATS_PER_MEASURE;
|
||||
var stepsPerBeat:Int = Flags.DEFAULT_STEPS_PER_BEAT;
|
||||
|
||||
// Check later, i dont think timeSignParsed can contain null, only nan
|
||||
// Check later, i don't think timeSignParsed can contain null, only nan
|
||||
if (timeSignParsed.length == 2 && !timeSignParsed.contains(null)) {
|
||||
beatsPerMeasure = timeSignParsed[0] == null || timeSignParsed[0] <= 0 ? Flags.DEFAULT_BEATS_PER_MEASURE : cast timeSignParsed[0];
|
||||
stepsPerBeat = timeSignParsed[1] == null || timeSignParsed[1] <= 0 ? Flags.DEFAULT_STEPS_PER_BEAT : cast timeSignParsed[1];
|
||||
@@ -884,9 +884,10 @@ class CoolUtil
|
||||
* Converts an array of numbers into a string of ranges.
|
||||
* Example: [1,2,3,5,7,8,9,8,7,6,5] -> "1..3,5,7..9,8..5"
|
||||
* @param numbers Array of numbers
|
||||
* @param separator Separator between ranges
|
||||
* @return String representing the ranges
|
||||
*/
|
||||
public static function formatNumberRange(numbers:Array<Int>, seperator:String = ","):String {
|
||||
public static function formatNumberRange(numbers:Array<Int>, separator:String = ","):String {
|
||||
if (numbers.length == 0) return "";
|
||||
|
||||
var result:Array<String> = [];
|
||||
@@ -923,7 +924,7 @@ class CoolUtil
|
||||
i++;
|
||||
}
|
||||
|
||||
return result.join(seperator);
|
||||
return result.join(separator);
|
||||
}
|
||||
|
||||
public static function deepFlatten(arr:Array<Dynamic>, ?result:Array<Dynamic>):Array<Dynamic> {
|
||||
|
||||
@@ -32,7 +32,7 @@ class FunkinSave {
|
||||
|
||||
if (!__eventAdded) {
|
||||
Lib.application.onExit.add(function(i:Int) {
|
||||
trace("Saving savedata...");
|
||||
trace("Saving save data...");
|
||||
flush();
|
||||
});
|
||||
__eventAdded = true;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package funkin.backend.utils;
|
||||
|
||||
/**
|
||||
* DOESNT SUPPORT CATEGORIES YET!!
|
||||
* DOESN'T SUPPORT CATEGORIES YET!!
|
||||
*/
|
||||
class IniUtil {
|
||||
public static inline function parseAsset(assetPath:String, ?defaultVariables:Map<String, String>)
|
||||
|
||||
@@ -35,9 +35,9 @@ class NativeAPI {
|
||||
/**
|
||||
* Gets the specified file's (or folder) attributes.
|
||||
*/
|
||||
public static function getFileAttributesRaw(path:String, useAbsol:Bool = true):Int {
|
||||
public static function getFileAttributesRaw(path:String, useAbsolute:Bool = true):Int {
|
||||
#if windows
|
||||
if(useAbsol) path = sys.FileSystem.absolutePath(path);
|
||||
if(useAbsolute) path = sys.FileSystem.absolutePath(path);
|
||||
return Windows.getFileAttributes(path);
|
||||
#else
|
||||
return -1;
|
||||
@@ -47,16 +47,16 @@ class NativeAPI {
|
||||
/**
|
||||
* Gets the specified file's (or folder) attributes and passes it to `FileAttributeWrapper`.
|
||||
*/
|
||||
public static function getFileAttributes(path:String, useAbsol:Bool = true):FileAttributeWrapper {
|
||||
return new FileAttributeWrapper(getFileAttributesRaw(path, useAbsol));
|
||||
public static function getFileAttributes(path:String, useAbsolute:Bool = true):FileAttributeWrapper {
|
||||
return new FileAttributeWrapper(getFileAttributesRaw(path, useAbsolute));
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the specified file's (or folder) attributes. If it fails, the return value is `0`.
|
||||
*/
|
||||
public static function setFileAttributes(path:String, attrib:OneOfThree<NativeAPI.FileAttribute, FileAttributeWrapper, Int>, useAbsol:Bool = true):Int {
|
||||
public static function setFileAttributes(path:String, attrib:OneOfThree<NativeAPI.FileAttribute, FileAttributeWrapper, Int>, useAbsolute:Bool = true):Int {
|
||||
#if windows
|
||||
if(useAbsol) path = sys.FileSystem.absolutePath(path);
|
||||
if(useAbsolute) path = sys.FileSystem.absolutePath(path);
|
||||
return Windows.setFileAttributes(path, attrib is FileAttributeWrapper ? cast(attrib, FileAttributeWrapper).getValue() : cast(attrib, Int));
|
||||
#else
|
||||
return 0;
|
||||
@@ -66,9 +66,9 @@ class NativeAPI {
|
||||
/**
|
||||
* Removes from the specified file's (or folder) one (or more) specific attribute.
|
||||
*/
|
||||
public static function addFileAttributes(path:String, attrib:OneOfTwo<NativeAPI.FileAttribute, Int>, useAbsol:Bool = true):Int {
|
||||
public static function addFileAttributes(path:String, attrib:OneOfTwo<NativeAPI.FileAttribute, Int>, useAbsolute:Bool = true):Int {
|
||||
#if windows
|
||||
return setFileAttributes(path, getFileAttributesRaw(path, useAbsol) | cast(attrib, Int), useAbsol);
|
||||
return setFileAttributes(path, getFileAttributesRaw(path, useAbsolute) | cast(attrib, Int), useAbsolute);
|
||||
#else
|
||||
return 0;
|
||||
#end
|
||||
@@ -77,9 +77,9 @@ class NativeAPI {
|
||||
/**
|
||||
* Removes from the specified file's (or folder) one (or more) specific attribute.
|
||||
*/
|
||||
public static function removeFileAttributes(path:String, attrib:OneOfTwo<NativeAPI.FileAttribute, Int>, useAbsol:Bool = true):Int {
|
||||
public static function removeFileAttributes(path:String, attrib:OneOfTwo<NativeAPI.FileAttribute, Int>, useAbsolute:Bool = true):Int {
|
||||
#if windows
|
||||
return setFileAttributes(path, getFileAttributesRaw(path, useAbsol) & ~cast(attrib, Int), useAbsol);
|
||||
return setFileAttributes(path, getFileAttributesRaw(path, useAbsolute) & ~cast(attrib, Int), useAbsolute);
|
||||
#else
|
||||
return 0;
|
||||
#end
|
||||
|
||||
@@ -38,7 +38,7 @@ class NdllUtil {
|
||||
return Reflect.makeVarArgs(function(a:Array<Dynamic>) {
|
||||
// This generates horrific code
|
||||
return funkin.backend.system.macros.Utils.generateReflectionLike(25, "func", "a");
|
||||
//return Reflect.callMethod(null, func, a); // wouldnt work for some reason, maybe cause like c++ functions doesnt have reflection enabled
|
||||
//return Reflect.callMethod(null, func, a); // wouldn't work for some reason, maybe cause like c++ functions doesn't have reflection enabled
|
||||
});
|
||||
#else
|
||||
Logs.trace('NDLLs are not supported on this platform.', WARNING);
|
||||
|
||||
@@ -21,13 +21,13 @@ import sys.thread.Thread;
|
||||
using StringTools;
|
||||
|
||||
// import ZipUtils; ZipUtils.uncompressZip(ZipUtils.openZip("E:\\Desktop\\test\\termination lua.ycemod"), "E:\\Desktop\\test\\uncompressed\\");
|
||||
// import ZipUtils; var e = ZipUtils.createZipFile("gjnsdghs.ycemod"); ZipUtils.writeFolderToZip(e, "./mods/Friday Night Funkin'/", "Friday Night Funkin'/"); e.flush(); e.close();
|
||||
// import ZipUtils; var e = ZipUtils.createZipFile("file.ycemod"); ZipUtils.writeFolderToZip(e, "./mods/Friday Night Funkin'/", "Friday Night Funkin'/"); e.flush(); e.close();
|
||||
|
||||
class ZipUtil {
|
||||
public static var bannedNames:Array<String> = [".git", ".gitignore", ".github", ".vscode", ".gitattributes", "readme.txt"];
|
||||
|
||||
/**
|
||||
* [Description] Uncompresses `zip` into the `destFolder` folder
|
||||
* [Description] Decompresses a `zip` into the `destFolder` folder
|
||||
* @param zip
|
||||
* @param destFolder
|
||||
*/
|
||||
|
||||
@@ -13,7 +13,7 @@ import funkin.backend.utils.NativeAPI.MessageBoxIcon;
|
||||
</target>
|
||||
')
|
||||
|
||||
// majority is taken from microsofts doc
|
||||
// majority is taken from Microsoft's doc
|
||||
@:cppFileCode('
|
||||
#include "mmdeviceapi.h"
|
||||
#include "combaseapi.h"
|
||||
@@ -132,7 +132,7 @@ class Windows {
|
||||
int darkMode = enable ? 1 : 0;
|
||||
|
||||
HWND window = FindWindowA(NULL, title.c_str());
|
||||
// Look for child windows if top level aint found
|
||||
// Look for child windows if top level is not found
|
||||
if (window == NULL) window = FindWindowExA(GetActiveWindow(), NULL, NULL, title.c_str());
|
||||
// If still not found, try to get the active window
|
||||
if (window == NULL) window = GetActiveWindow();
|
||||
|
||||
@@ -37,11 +37,11 @@ class DebugOptionsScreen extends OptionsScreen {
|
||||
#end
|
||||
add(new Checkbox(
|
||||
"Editor SFXs",
|
||||
"If checked, will play sound effects when working on editors (ex: will play sfxs when checking checkboxes...)",
|
||||
"If checked, will play sound effects when working on editors (ex: will play SFXs when checking checkboxes...)",
|
||||
"editorSFX"));
|
||||
add(new Checkbox(
|
||||
"Pretty Print",
|
||||
"If checked, the saved files from the editor will be formatted to be easily viewable (does not apply to xmls...)",
|
||||
"If checked, the saved files from the editor will be formatted to be easily viewable (does not apply to XMLs...)",
|
||||
"editorPrettyPrint"));
|
||||
add(new Checkbox(
|
||||
"Intensive Blur",
|
||||
@@ -65,7 +65,7 @@ class DebugOptionsScreen extends OptionsScreen {
|
||||
));
|
||||
add(new Checkbox(
|
||||
"Autosaves Folder",
|
||||
"If checked, this will autosave your file in a seperate folder with a time stamp instead of overriding your current file. (song/autosaves/)",
|
||||
"charterAutoSavesSeperateFolder"));
|
||||
"If checked, this will autosave your file in a separate folder with a time stamp instead of overriding your current file. (song/autosaves/)",
|
||||
"charterAutoSavesSeparateFolder"));
|
||||
}
|
||||
}
|
||||
@@ -29,7 +29,7 @@ class CharacterEditor extends UIState {
|
||||
public var uiGroup:FlxTypedGroup<FlxSprite> = new FlxTypedGroup<FlxSprite>();
|
||||
|
||||
// WINDOWS
|
||||
public var characterPropertiresWindow:CharacterPropertiesWindow;
|
||||
public var characterPropertiesWindow:CharacterPropertiesWindow;
|
||||
public var characterAnimsWindow:UIButtonList<CharacterAnimButtons>;
|
||||
|
||||
// camera for the character itself so that it can be unzoomed/zoomed in again
|
||||
@@ -237,8 +237,8 @@ class CharacterEditor extends UIState {
|
||||
topMenuSpr = new UITopMenu(topMenu);
|
||||
topMenuSpr.cameras = uiGroup.cameras = [uiCamera];
|
||||
|
||||
characterPropertiresWindow = new CharacterPropertiesWindow();
|
||||
uiGroup.add(characterPropertiresWindow);
|
||||
characterPropertiesWindow = new CharacterPropertiesWindow();
|
||||
uiGroup.add(characterPropertiesWindow);
|
||||
|
||||
characterAnimsWindow = new UIButtonList<CharacterAnimButtons>(777, 209, 473, 488, "Character Animations", FlxPoint.get(429, 32));
|
||||
characterAnimsWindow.addButton.callback = function() CharacterEditor.instance.createAnimWithUI();
|
||||
@@ -284,9 +284,9 @@ class CharacterEditor extends UIState {
|
||||
}
|
||||
|
||||
if (character != null)
|
||||
characterPropertiresWindow.characterInfo.text = '${character.getNameList().length} Animations\nFlipped: ${character.flipX}\nSprite: ${character.sprite}\nAnim: ${character.getAnimName()}\nOffset: (${character.frameOffset.x}, ${character.frameOffset.y})';
|
||||
characterPropertiesWindow.characterInfo.text = '${character.getNameList().length} Animations\nFlipped: ${character.flipX}\nSprite: ${character.sprite}\nAnim: ${character.getAnimName()}\nOffset: (${character.frameOffset.x}, ${character.frameOffset.y})';
|
||||
|
||||
if (!(characterPropertiresWindow.hovered || characterAnimsWindow.hovered) && !characterAnimsWindow.dragging) {
|
||||
if (!(characterPropertiesWindow.hovered || characterAnimsWindow.hovered) && !characterAnimsWindow.dragging) {
|
||||
if (FlxG.mouse.wheel != 0) {
|
||||
zoom += 0.25 * FlxG.mouse.wheel;
|
||||
__camZoom = Math.pow(2, zoom);
|
||||
@@ -441,7 +441,7 @@ class CharacterEditor extends UIState {
|
||||
}));
|
||||
}
|
||||
|
||||
public function createAnim(animData:AnimData, animID:Int = -1, addtoUndo:Bool = true) {
|
||||
public function createAnim(animData:AnimData, animID:Int = -1, addToUndo:Bool = true) {
|
||||
XMLUtil.addAnimToSprite(character, animData);
|
||||
ghosts.createGhost(animData.name);
|
||||
var newButton = new CharacterAnimButtons(0, 0, animData.name, FlxPoint.get(animData.x,animData.y));
|
||||
@@ -450,11 +450,11 @@ class CharacterEditor extends UIState {
|
||||
|
||||
playAnimation(animData.name);
|
||||
|
||||
if (addtoUndo)
|
||||
if (addToUndo)
|
||||
undos.addToUndo(CCreateAnim(character.getNameList().length, animData));
|
||||
}
|
||||
|
||||
public function editAnim(name:String, animData:AnimData, addtoUndo:Bool = true) {
|
||||
public function editAnim(name:String, animData:AnimData, addToUndo:Bool = true) {
|
||||
var oldAnimData:AnimData = character.animDatas.get(name);
|
||||
var buttoner:CharacterAnimButtons = null;
|
||||
for (button in characterAnimsWindow.buttons.members)
|
||||
@@ -468,11 +468,11 @@ class CharacterEditor extends UIState {
|
||||
if (character.getAnimName() == animData.name) // update anim ifs its currently selected
|
||||
playAnimation(animData.name);
|
||||
|
||||
if (addtoUndo)
|
||||
if (addToUndo)
|
||||
undos.addToUndo(CEditAnim(animData.name, oldAnimData, animData));
|
||||
}
|
||||
|
||||
public function deleteAnim(name:String, addtoUndo:Bool = true) {
|
||||
public function deleteAnim(name:String, addToUndo:Bool = true) {
|
||||
var animOrder:Array<String> = [
|
||||
for (button in characterAnimsWindow.buttons.members)
|
||||
button.anim
|
||||
@@ -495,7 +495,7 @@ class CharacterEditor extends UIState {
|
||||
if (character.animOffsets.exists(name)) character.animOffsets.remove(name);
|
||||
if (character.animDatas.exists(name)) character.animDatas.remove(name);
|
||||
|
||||
if (addtoUndo)
|
||||
if (addToUndo)
|
||||
undos.addToUndo(CDeleteAnim(oldID, oldAnimData));
|
||||
}
|
||||
|
||||
@@ -505,7 +505,7 @@ class CharacterEditor extends UIState {
|
||||
}));
|
||||
}
|
||||
|
||||
public function editInfo(newInfo:Xml, addtoUndo:Bool = true) {
|
||||
public function editInfo(newInfo:Xml, addToUndo:Bool = true) {
|
||||
var lastAnim:String = character.getAnimName();
|
||||
|
||||
var oldInfo = character.buildXML();
|
||||
@@ -514,7 +514,7 @@ class CharacterEditor extends UIState {
|
||||
|
||||
playAnimation(lastAnim);
|
||||
|
||||
if (addtoUndo)
|
||||
if (addToUndo)
|
||||
undos.addToUndo(CEditInfo(oldInfo, newInfo));
|
||||
}
|
||||
|
||||
@@ -581,7 +581,7 @@ class CharacterEditor extends UIState {
|
||||
clearOffsets();
|
||||
}
|
||||
|
||||
function changeOffset(anim:String, change:FlxPoint, addtoUndo:Bool = true) {
|
||||
function changeOffset(anim:String, change:FlxPoint, addToUndo:Bool = true) {
|
||||
if (character.getNameList().length == 0) return;
|
||||
|
||||
var animData = character.animDatas.get(anim);
|
||||
@@ -598,11 +598,11 @@ class CharacterEditor extends UIState {
|
||||
|
||||
ghosts.updateOffsets(anim, change);
|
||||
|
||||
if (addtoUndo)
|
||||
if (addToUndo)
|
||||
undos.addToUndo(CChangeOffset(anim, change));
|
||||
}
|
||||
|
||||
function clearOffsets(addtoUndo:Bool = true) {
|
||||
function clearOffsets(addToUndo:Bool = true) {
|
||||
if (character.getNameList().length == 0) return;
|
||||
|
||||
var oldOffsets:Map<String, FlxPoint> = [
|
||||
@@ -619,7 +619,7 @@ class CharacterEditor extends UIState {
|
||||
changeOffset(character.getAnimName(), FlxPoint.get(), false);
|
||||
ghosts.clearOffsets();
|
||||
|
||||
if (addtoUndo)
|
||||
if (addToUndo)
|
||||
undos.addToUndo(CResetOffsets(oldOffsets));
|
||||
}
|
||||
|
||||
|
||||
@@ -44,7 +44,7 @@ class CharacterSelection extends EditorTreeMenu
|
||||
}
|
||||
|
||||
list.insert(0, new NewOption("New Character", "New Character", function() {
|
||||
openSubState(new UIWarningSubstate("New Character: Feature Not Implemented!", "This feature isnt implemented yet. Please wait for more cne updates to have this functional.\n\n\n- Codename Devs", [
|
||||
openSubState(new UIWarningSubstate("New Character: Feature Not Implemented!", "This feature isn't implemented yet. Please wait for more cne updates to have this functional.\n\n\n- Codename Devs", [
|
||||
{label: "Ok", color: 0xFFFF0000, onClick: function(t) {}}
|
||||
]));
|
||||
}));
|
||||
|
||||
@@ -61,7 +61,7 @@ class ChartCreationScreen extends UISubstateWindow {
|
||||
scrollSpeedTextBox.onChange = function (text:String) {
|
||||
@:privateAccess scrollSpeedTextBox.__onChange(text);
|
||||
for (button in strumLineList.buttons.members)
|
||||
if (button.usesChartscrollSpeed.checked)
|
||||
if (button.usesChartScrollSpeed.checked)
|
||||
button.scrollSpeedStepper.value = scrollSpeedTextBox.value;
|
||||
}
|
||||
add(scrollSpeedTextBox);
|
||||
@@ -148,7 +148,7 @@ class ChartCreationScreen extends UISubstateWindow {
|
||||
@:privateAccess stepper.__onChange(stepper.label.text);
|
||||
|
||||
strumLines.push({
|
||||
characters: [for (charb in strline.charactersList.buttons.members) charb.textBox.label.text],
|
||||
characters: [for (char in strline.charactersList.buttons.members) char.textBox.label.text],
|
||||
type: strline.typeDropdown.index,
|
||||
notes: [],
|
||||
position: strline.stagePositionDropdown.label.text.toLowerCase(),
|
||||
@@ -156,7 +156,7 @@ class ChartCreationScreen extends UISubstateWindow {
|
||||
strumPos: [0, strline.hudYStepper.value],
|
||||
strumLinePos: strline.hudXStepper.value,
|
||||
strumScale: strline.hudScaleStepper.value,
|
||||
scrollSpeed: strline.usesChartscrollSpeed.checked ? strline.scrollSpeedStepper.value : null
|
||||
scrollSpeed: strline.usesChartScrollSpeed.checked ? strline.scrollSpeedStepper.value : null
|
||||
});
|
||||
}
|
||||
|
||||
@@ -185,7 +185,7 @@ class StrumLineButton extends UIButton {
|
||||
public var hudYStepper:UINumericStepper;
|
||||
public var visibleCheckbox:UICheckbox;
|
||||
public var scrollSpeedStepper:UINumericStepper;
|
||||
public var usesChartscrollSpeed:UICheckbox;
|
||||
public var usesChartScrollSpeed:UICheckbox;
|
||||
|
||||
public var deleteButton:UIButton;
|
||||
public var deleteIcon:FlxSprite;
|
||||
@@ -260,15 +260,15 @@ class StrumLineButton extends UIButton {
|
||||
members.push(scrollSpeedStepper);
|
||||
addLabelOn(scrollSpeedStepper, "Scroll Speed");
|
||||
|
||||
usesChartscrollSpeed = new UICheckbox(scrollSpeedStepper.x + 104, typeDropdown.y + 135, "Uses charts scroll speed?", strumLine.scrollSpeed == null);
|
||||
usesChartscrollSpeed.onChecked = function(b) {
|
||||
usesChartScrollSpeed = new UICheckbox(scrollSpeedStepper.x + 104, typeDropdown.y + 135, "Uses charts scroll speed?", strumLine.scrollSpeed == null);
|
||||
usesChartScrollSpeed.onChecked = function(b) {
|
||||
if(b) {
|
||||
scrollSpeedStepper.value = subState.scrollSpeedTextBox.value;
|
||||
scrollSpeedStepper.selectable = false;
|
||||
} else
|
||||
scrollSpeedStepper.selectable = true;
|
||||
}
|
||||
members.push(usesChartscrollSpeed);
|
||||
members.push(usesChartScrollSpeed);
|
||||
|
||||
deleteButton = new UIButton(16, 246-32-11, "", function () {
|
||||
parent.remove(this);
|
||||
@@ -293,7 +293,7 @@ class StrumLineButton extends UIButton {
|
||||
hudYStepper.follow(this, hudXStepper.x + 84 - 32 + 26, 8+26 + 64);
|
||||
visibleCheckbox.follow(this, hudYStepper.x + hudYStepper.bWidth + 42, 8+26 + 64 + 9);
|
||||
scrollSpeedStepper.follow(this, typeDropdown.x, 8+26 + 128);
|
||||
usesChartscrollSpeed.follow(this, scrollSpeedStepper.x + 104, 8+26 + 135);
|
||||
usesChartScrollSpeed.follow(this, scrollSpeedStepper.x + 104, 8+26 + 135);
|
||||
|
||||
deleteButton.follow(this, 16, 246-32-11);
|
||||
deleteIcon.follow(this, 16 + ((deleteButton.bWidth/2)-(15/2)), (246-32-11) + ((deleteButton.bHeight/2)-(16/2)));
|
||||
|
||||
@@ -714,10 +714,10 @@ class Charter extends UIState {
|
||||
autoSaveTimer -= elapsed;
|
||||
|
||||
if (autoSaveTimer < Options.charterAutoSaveWarningTime && !autoSaveNotif.cancelled && !autoSaveNotif.showedAnimation) {
|
||||
if (Options.charterAutoSavesSeperateFolder)
|
||||
if (Options.charterAutoSavesSeparateFolder)
|
||||
__autoSaveLocation = __diff.toLowerCase() + DateTools.format(Date.now(), "%m-%d_%H-%M");
|
||||
autoSaveNotif.startAutoSave(autoSaveTimer,
|
||||
!Options.charterAutoSavesSeperateFolder ? 'Saved chart at ${__diff.toLowerCase()}.json!' :
|
||||
!Options.charterAutoSavesSeparateFolder ? 'Saved chart at ${__diff.toLowerCase()}.json!' :
|
||||
'Saved chart at $__autoSaveLocation.json!'
|
||||
);
|
||||
}
|
||||
@@ -727,7 +727,7 @@ class Charter extends UIState {
|
||||
buildChart();
|
||||
var songPath:String = '${Paths.getAssetsRoot()}/songs/${__song.toLowerCase()}';
|
||||
|
||||
if (Options.charterAutoSavesSeperateFolder)
|
||||
if (Options.charterAutoSavesSeparateFolder)
|
||||
Chart.save(songPath, PlayState.SONG, __autoSaveLocation, {saveMetaInChart: false, folder: "autosaves", prettyPrint: Options.editorPrettyPrint});
|
||||
else
|
||||
Chart.save(songPath, PlayState.SONG, __diff.toLowerCase(), {saveMetaInChart: false, prettyPrint: Options.editorPrettyPrint});
|
||||
@@ -820,7 +820,7 @@ class Charter extends UIState {
|
||||
|
||||
var boundedChange:FlxPoint = changePoint.clone();
|
||||
|
||||
// Some maths, so cool bro -lunar (i dont know why i quopte my self here)
|
||||
// Some maths, so cool bro -lunar (i don't know why i quote my self here)
|
||||
if (s.step + changePoint.x < 0) boundedChange.x += Math.abs(s.step + changePoint.x);
|
||||
if (s.step + changePoint.x > __endStep-1) boundedChange.x -= (s.step + changePoint.x) - (__endStep-1);
|
||||
|
||||
@@ -1651,7 +1651,7 @@ class Charter extends UIState {
|
||||
inline function _snap_resetsnap(_) setquant(16);
|
||||
|
||||
inline function changequant(change:Int) {quant = quants[FlxMath.wrap(quants.indexOf(quant) + change, 0, quants.length-1)]; buildSnapsUI();};
|
||||
inline function setquant(newquant:Int) {quant = newquant; buildSnapsUI();}
|
||||
inline function setquant(newQuant:Int) {quant = newQuant; buildSnapsUI();}
|
||||
|
||||
function buildSnapsUI():Array<UIContextMenuOption> {
|
||||
var snapsTopButton:UITopMenuButton = topMenuSpr == null ? null : cast topMenuSpr.members[snapIndex];
|
||||
@@ -1856,7 +1856,7 @@ class Charter extends UIState {
|
||||
return newSelection.filter((s:ICharterSelectable) -> {return s != null;});
|
||||
}
|
||||
|
||||
// UH OH!!! DANGER ZONE APPOARCHING !!!! LUNARS SHITTY CODE !!!! -lunar
|
||||
// UH OH!!! DANGER ZONE APPROACHING !!!! LUNARS SHITTY CODE !!!! -lunar
|
||||
|
||||
@:noCompletion public function __relinkSingleSelection(selectable:ICharterSelectable):ICharterSelectable {
|
||||
if (selectable is CharterNote)
|
||||
|
||||
@@ -63,7 +63,7 @@ class CharterAutoSaveUI extends UISliceSprite {
|
||||
var __timer:FlxTimer;
|
||||
var __tween:FlxTween;
|
||||
|
||||
public function startAutoSave(time:Float, sucessText:String) {
|
||||
public function startAutoSave(time:Float, successText:String) {
|
||||
appearAnimation();
|
||||
|
||||
__tween = FlxTween.num(0, 1, time, null, (v:Float) -> {
|
||||
@@ -74,7 +74,7 @@ class CharterAutoSaveUI extends UISliceSprite {
|
||||
});
|
||||
__timer = new FlxTimer();
|
||||
__timer.start(time, (_) -> {
|
||||
autosavingText.text = sucessText; cancelButton.visible = false;
|
||||
autosavingText.text = successText; cancelButton.visible = false;
|
||||
|
||||
icon.animation.curAnim.curFrame = 1;
|
||||
for (member in [this, progressBar, progressBarBack, autosavingText]) member.color = 0xFFA3EC95;
|
||||
|
||||
@@ -23,7 +23,7 @@ class CharterMetaDataScreen extends UISubstateWindow {
|
||||
public var opponentModeCheckbox:UICheckbox;
|
||||
public var coopAllowedCheckbox:UICheckbox;
|
||||
public var colorWheel:UIColorwheel;
|
||||
public var difficulitesTextBox:UITextBox;
|
||||
public var difficultiesTextBox:UITextBox;
|
||||
|
||||
public function new(metadata:ChartMetaData) {
|
||||
super();
|
||||
@@ -88,9 +88,9 @@ class CharterMetaDataScreen extends UISubstateWindow {
|
||||
add(colorWheel);
|
||||
addLabelOn(colorWheel, "Color");
|
||||
|
||||
difficulitesTextBox = new UITextBox(opponentModeCheckbox.x, opponentModeCheckbox.y + 6 + 32 + 26, metadata.difficulties.join(", "));
|
||||
add(difficulitesTextBox);
|
||||
addLabelOn(difficulitesTextBox, "Difficulties");
|
||||
difficultiesTextBox = new UITextBox(opponentModeCheckbox.x, opponentModeCheckbox.y + 6 + 32 + 26, metadata.difficulties.join(", "));
|
||||
add(difficultiesTextBox);
|
||||
addLabelOn(difficultiesTextBox, "Difficulties");
|
||||
|
||||
customPropertiesButtonList = new UIButtonList<PropertyButton>(stepsPerBeatStepper.x + 80 + 26 + 105, songNameTextBox.y, 290, 316, '', FlxPoint.get(280, 35), null, 5);
|
||||
customPropertiesButtonList.frames = Paths.getFrames('editors/ui/inputbox');
|
||||
@@ -162,7 +162,7 @@ class CharterMetaDataScreen extends UISubstateWindow {
|
||||
parsedColor: colorWheel.curColor,
|
||||
opponentModeAllowed: opponentModeCheckbox.checked,
|
||||
coopAllowed: coopAllowedCheckbox.checked,
|
||||
difficulties: [for (diff in difficulitesTextBox.label.text.split(",")) diff.trim()],
|
||||
difficulties: [for (diff in difficultiesTextBox.label.text.split(",")) diff.trim()],
|
||||
customValues: customVals,
|
||||
};
|
||||
|
||||
|
||||
@@ -89,10 +89,10 @@ class CharterSelection extends EditorTreeMenu {
|
||||
}
|
||||
|
||||
public function saveSong(creation:SongCreationData) {
|
||||
var songAlreadlyExsits:Bool = [for (s in freeplayList.songs) s.name.toLowerCase()].contains(creation.meta.name.toLowerCase());
|
||||
var songAlreadyExists:Bool = [for (s in freeplayList.songs) s.name.toLowerCase()].contains(creation.meta.name.toLowerCase());
|
||||
|
||||
if (songAlreadlyExsits) {
|
||||
openSubState(new UIWarningSubstate("Creating Song: Error!", "The song you are trying to create alreadly exists, if you would like to override it delete the song first!", [
|
||||
if (songAlreadyExists) {
|
||||
openSubState(new UIWarningSubstate("Creating Song: Error!", "The song you are trying to create Already exists, if you would like to override it delete the song first!", [
|
||||
{label: "Ok", color: 0xFFFF0000, onClick: function(t) {}}
|
||||
]));
|
||||
return;
|
||||
@@ -134,10 +134,10 @@ class CharterSelection extends EditorTreeMenu {
|
||||
}
|
||||
|
||||
public function saveChart(name:String, data:ChartData) {
|
||||
var difficultyAlreadlyExsits:Bool = curSong.difficulties.contains(name);
|
||||
var difficultyAlreadyExists:Bool = curSong.difficulties.contains(name);
|
||||
|
||||
if (difficultyAlreadlyExsits) {
|
||||
openSubState(new UIWarningSubstate("Creating Chart: Error!", "The chart you are trying to create alreadly exists, if you would like to override it delete the chart first!", [
|
||||
if (difficultyAlreadyExists) {
|
||||
openSubState(new UIWarningSubstate("Creating Chart: Error!", "The chart you are trying to create already exists, if you would like to override it delete the chart first!", [
|
||||
{label: "Ok", color: 0xFFFF0000, onClick: function(t) {}}
|
||||
]));
|
||||
return;
|
||||
|
||||
@@ -18,7 +18,7 @@ class CharterStrumlineScreen extends UISubstateWindow {
|
||||
public var hudYStepper:UINumericStepper;
|
||||
public var visibleCheckbox:UICheckbox;
|
||||
public var scrollSpeedStepper:UINumericStepper;
|
||||
public var usesChartscrollSpeed:UICheckbox;
|
||||
public var usesChartScrollSpeed:UICheckbox;
|
||||
|
||||
public var characterIcons:Array<HealthIcon> = [];
|
||||
|
||||
@@ -78,8 +78,8 @@ class CharterStrumlineScreen extends UISubstateWindow {
|
||||
add(typeDropdown);
|
||||
addLabelOn(typeDropdown, "Type");
|
||||
|
||||
usesChartscrollSpeed = new UICheckbox(typeDropdown.x + 104, typeDropdown.y + 135, "Uses charts scroll speed?", strumLine.scrollSpeed == null);
|
||||
usesChartscrollSpeed.onChecked = function(b) {
|
||||
usesChartScrollSpeed = new UICheckbox(typeDropdown.x + 104, typeDropdown.y + 135, "Uses charts scroll speed?", strumLine.scrollSpeed == null);
|
||||
usesChartScrollSpeed.onChecked = function(b) {
|
||||
if(b)
|
||||
{
|
||||
scrollSpeedStepper.value = PlayState.SONG.scrollSpeed;
|
||||
@@ -88,10 +88,10 @@ class CharterStrumlineScreen extends UISubstateWindow {
|
||||
scrollSpeedStepper.selectable = true;
|
||||
}
|
||||
}
|
||||
add(usesChartscrollSpeed);
|
||||
add(usesChartScrollSpeed);
|
||||
|
||||
scrollSpeedStepper = new UINumericStepper(typeDropdown.x, typeDropdown.y + 128, usesChartscrollSpeed.checked ? PlayState.SONG.scrollSpeed : strumLine.scrollSpeed, 0.1, 2, 0, 10, 82);
|
||||
if(usesChartscrollSpeed.checked)
|
||||
scrollSpeedStepper = new UINumericStepper(typeDropdown.x, typeDropdown.y + 128, usesChartScrollSpeed.checked ? PlayState.SONG.scrollSpeed : strumLine.scrollSpeed, 0.1, 2, 0, 10, 82);
|
||||
if(usesChartScrollSpeed.checked)
|
||||
{
|
||||
scrollSpeedStepper.selectable = false;
|
||||
} else {
|
||||
@@ -141,20 +141,20 @@ class CharterStrumlineScreen extends UISubstateWindow {
|
||||
add(closeButton);
|
||||
closeButton.color = 0xFFFF0000;
|
||||
|
||||
var suffixlist = ["NONE"];
|
||||
var suffixList = ["NONE"];
|
||||
for (i in Paths.getFolderContent('songs/${Charter.__song.toLowerCase()}/song'))
|
||||
if (i.startsWith("Voices")) {
|
||||
i = haxe.io.Path.withoutExtension(i.substr("Voices".length));
|
||||
if (i == "") continue;
|
||||
for (j in PlayState.SONG.meta.difficulties) {
|
||||
if (i.endsWith('-${j.toLowerCase()}'))
|
||||
suffixlist.pushOnce(i.substring(0, i.length - j.length));
|
||||
suffixList.pushOnce(i.substring(0, i.length - j.length));
|
||||
else
|
||||
suffixlist.pushOnce(i);
|
||||
suffixList.pushOnce(i);
|
||||
}
|
||||
}
|
||||
|
||||
vocalsSuffixDropDown = new UIDropDown(typeDropdown.x, hudScaleStepper.y + 128, 200, 32, suffixlist, strumLine.vocalsSuffix != null && strumLine.vocalsSuffix != "" ? suffixlist.indexOf(strumLine.vocalsSuffix) : 0);
|
||||
vocalsSuffixDropDown = new UIDropDown(typeDropdown.x, hudScaleStepper.y + 128, 200, 32, suffixList, strumLine.vocalsSuffix != null && strumLine.vocalsSuffix != "" ? suffixList.indexOf(strumLine.vocalsSuffix) : 0);
|
||||
add(vocalsSuffixDropDown);
|
||||
addLabelOn(vocalsSuffixDropDown, "Vocal Suffix");
|
||||
}
|
||||
@@ -177,7 +177,7 @@ class CharterStrumlineScreen extends UISubstateWindow {
|
||||
strumScale: hudScaleStepper.value,
|
||||
vocalsSuffix: vocalsSuffixDropDown.options[vocalsSuffixDropDown.index] != "NONE" ? vocalsSuffixDropDown.options[vocalsSuffixDropDown.index] : ""
|
||||
};
|
||||
if(!usesChartscrollSpeed.checked) newStrumLine.scrollSpeed = scrollSpeedStepper.value;
|
||||
if(!usesChartScrollSpeed.checked) newStrumLine.scrollSpeed = scrollSpeedStepper.value;
|
||||
if (onSave != null) onSave(newStrumLine);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@ class SongCreationScreen extends UISubstateWindow {
|
||||
public var opponentModeCheckbox:UICheckbox;
|
||||
public var coopAllowedCheckbox:UICheckbox;
|
||||
public var colorWheel:UIColorwheel;
|
||||
public var difficulitesTextBox:UITextBox;
|
||||
public var difficultiesTextBox:UITextBox;
|
||||
|
||||
public var backButton:UIButton;
|
||||
public var saveButton:UIButton;
|
||||
@@ -125,9 +125,9 @@ class SongCreationScreen extends UISubstateWindow {
|
||||
menuDataGroup.add(colorWheel);
|
||||
addLabelOn(colorWheel, "Color");
|
||||
|
||||
difficulitesTextBox = new UITextBox(opponentModeCheckbox.x, opponentModeCheckbox.y + 6 + 32 + 26, "");
|
||||
menuDataGroup.add(difficulitesTextBox);
|
||||
addLabelOn(difficulitesTextBox, "Difficulties");
|
||||
difficultiesTextBox = new UITextBox(opponentModeCheckbox.x, opponentModeCheckbox.y + 6 + 32 + 26, "");
|
||||
menuDataGroup.add(difficultiesTextBox);
|
||||
addLabelOn(difficultiesTextBox, "Difficulties");
|
||||
|
||||
for (checkbox in [opponentModeCheckbox, coopAllowedCheckbox])
|
||||
{checkbox.y += 6; checkbox.x += 4;}
|
||||
@@ -240,7 +240,7 @@ class SongCreationScreen extends UISubstateWindow {
|
||||
parsedColor: colorWheel.curColor,
|
||||
opponentModeAllowed: opponentModeCheckbox.checked,
|
||||
coopAllowed: coopAllowedCheckbox.checked,
|
||||
difficulties: [for (diff in difficulitesTextBox.label.text.split(",")) diff.trim()],
|
||||
difficulties: [for (diff in difficultiesTextBox.label.text.split(",")) diff.trim()],
|
||||
};
|
||||
|
||||
if (onSave != null) onSave({
|
||||
|
||||
@@ -44,10 +44,10 @@ class UIColorwheel extends UISliceSprite {
|
||||
|
||||
// Im too lazy to use a shader for this if its not even gonna change
|
||||
colorSlider.pixels.lock();
|
||||
for (pixely in 0...Std.int(colorSlider.height)) {
|
||||
var color:Int = FlxColor.fromHSB(pixely / (colorSlider.height-1) * 360, 1, 1);
|
||||
for (pixelx in 0...Std.int(colorSlider.width))
|
||||
if (colorSlider.pixels.getPixel32(pixelx, pixely) != FlxColor.TRANSPARENT) colorSlider.pixels.setPixel32(pixelx, pixely, color);
|
||||
for (pixelY in 0...Std.int(colorSlider.height)) {
|
||||
var color:Int = FlxColor.fromHSB(pixelY / (colorSlider.height-1) * 360, 1, 1);
|
||||
for (pixelX in 0...Std.int(colorSlider.width))
|
||||
if (colorSlider.pixels.getPixel32(pixelX, pixelY) != FlxColor.TRANSPARENT) colorSlider.pixels.setPixel32(pixelX, pixelY, color);
|
||||
}
|
||||
colorSlider.pixels.unlock();
|
||||
|
||||
@@ -123,7 +123,7 @@ class UIColorwheel extends UISliceSprite {
|
||||
public var colorChanged:Bool = false;
|
||||
|
||||
// Make the colorwheel feel better
|
||||
static inline var hitBoxExtenstion:Float = 8;
|
||||
static inline var hitBoxExtension:Float = 8;
|
||||
|
||||
public override function update(elapsed:Float) {
|
||||
if (hovered && FlxG.mouse.pressed) {
|
||||
@@ -132,7 +132,7 @@ class UIColorwheel extends UISliceSprite {
|
||||
for (sprite in [colorPicker, colorSlider]) {
|
||||
var spritePos:FlxPoint = sprite.getScreenPosition(FlxPoint.get(), __lastDrawCameras[0]);
|
||||
|
||||
if (((mousePos.x > (spritePos.x - (hitBoxExtenstion/2))) && (mousePos.x < spritePos.x - (hitBoxExtenstion/2) + (sprite.width + hitBoxExtenstion))) && ((mousePos.y > (spritePos.y - (hitBoxExtenstion/2))) && (mousePos.y < spritePos.y - (hitBoxExtenstion/2) + (sprite.height + hitBoxExtenstion)))) {
|
||||
if (((mousePos.x > (spritePos.x - (hitBoxExtension/2))) && (mousePos.x < spritePos.x - (hitBoxExtension/2) + (sprite.width + hitBoxExtension))) && ((mousePos.y > (spritePos.y - (hitBoxExtension/2))) && (mousePos.y < spritePos.y - (hitBoxExtension/2) + (sprite.height + hitBoxExtension)))) {
|
||||
mousePos -= FlxPoint.weak(spritePos.x, spritePos.y);
|
||||
mousePos.set(FlxMath.bound(mousePos.x, 0, sprite.width), FlxMath.bound(mousePos.y, 0, sprite.height));
|
||||
|
||||
|
||||
@@ -5,14 +5,14 @@ import flixel.util.FlxColor;
|
||||
using StringTools;
|
||||
using flixel.util.FlxSpriteUtil;
|
||||
|
||||
typedef SliderSegement = {
|
||||
typedef SliderSegment = {
|
||||
var start:Float;
|
||||
var end:Float;
|
||||
var size:Float;
|
||||
}
|
||||
|
||||
class UISlider extends UISprite {
|
||||
public var segments:Array<SliderSegement> = [];
|
||||
public var segments:Array<SliderSegment> = [];
|
||||
public var barWidth:Int = 120;
|
||||
|
||||
public var progressbar:UISprite;
|
||||
@@ -36,7 +36,7 @@ class UISlider extends UISprite {
|
||||
public var valueStepper:UINumericStepper;
|
||||
public var onChange:Float->Void;
|
||||
|
||||
public function new(x:Float, y:Float, width:Int = 120, value:Float, segments:Array<SliderSegement>, centered:Bool) {
|
||||
public function new(x:Float, y:Float, width:Int = 120, value:Float, segments:Array<SliderSegment>, centered:Bool) {
|
||||
this.segments = segments;
|
||||
this.barWidth = width;
|
||||
this.progressCentered = centered;
|
||||
|
||||
@@ -15,7 +15,7 @@ class UIUtil {
|
||||
}
|
||||
|
||||
/**
|
||||
* Process all options with shortcuts present in a `Array<UIContextMenuOption>`. Also checks childrens.
|
||||
* Process all options with shortcuts present in a `Array<UIContextMenuOption>`. Also checks children.
|
||||
* @param topMenuOptions
|
||||
*/
|
||||
public static function processShortcuts(topMenuOptions:Array<UIContextMenuOption>) {
|
||||
|
||||
@@ -117,7 +117,7 @@ class NoteGroup extends FlxTypedGroup<Note> {
|
||||
if (index < 0)
|
||||
return null;
|
||||
|
||||
// doesnt prevent looping from breaking
|
||||
// doesn't prevent looping from breaking
|
||||
if (Splice && __currentlyLooping && i >= index)
|
||||
i++;
|
||||
|
||||
|
||||
@@ -423,7 +423,7 @@ class PlayState extends MusicBeatState
|
||||
*/
|
||||
public var events:Array<ChartEvent> = [];
|
||||
/**
|
||||
* Current camera target. -1 means no automatic camera targetting.
|
||||
* Current camera target. -1 means no automatic camera targeting.
|
||||
*/
|
||||
public var curCameraTarget:Int = 0;
|
||||
/**
|
||||
@@ -642,7 +642,7 @@ class PlayState extends MusicBeatState
|
||||
for(folder in scriptsFolders) {
|
||||
for(file in Paths.getFolderContent(folder, true, fromMods ? MODS : BOTH)) {
|
||||
if (folder == 'data/charts/')
|
||||
Logs.trace('[PlayState] data/charts/ is deprecrated and will be removed in the future. Please move script $file to songs/', WARNING, DARKYELLOW);
|
||||
Logs.trace('[PlayState] data/charts/ is deprecated and will be removed in the future. Please move script $file to songs/', WARNING, DARKYELLOW);
|
||||
|
||||
addScript(file);
|
||||
}
|
||||
|
||||
@@ -35,7 +35,7 @@ class SplashGroup extends FlxTypedGroup<FunkinSprite> {
|
||||
pregenerateSplashes(splash);
|
||||
add(splash);
|
||||
|
||||
// immediatly draw once and put image in GPU to prevent freezes
|
||||
// immediately draw once and put image in GPU to prevent freezes
|
||||
// TODO: change to graphics cache
|
||||
splash.drawComplex(FlxG.camera);
|
||||
} catch(e:Dynamic) {
|
||||
|
||||
@@ -185,7 +185,7 @@ class Stage extends FlxBasic implements IBeatReceiver {
|
||||
|
||||
setStagesSprites(stageScript);
|
||||
|
||||
// i know this for gets run twice under, but its better like this in case a script modifies the short lived ones, i dont wanna save them in an array; more dynamic like this - Nex
|
||||
// i know this for gets run twice under, but its better like this in case a script modifies the short lived ones, i don't wanna save them in an array; more dynamic like this - Nex
|
||||
for (info in xmlImportedScripts) if (info.importStageSprites) {
|
||||
var script = info.getScript();
|
||||
if (script != null) setStagesSprites(script);
|
||||
|
||||
@@ -71,7 +71,7 @@ class StrumLine extends FlxTypedGroup<Strum> {
|
||||
*/
|
||||
public var animSuffix(default, set):String = "";
|
||||
/**
|
||||
* TODO: Write documention about this being a variable that can help when making multi key
|
||||
* TODO: Write documentation about this being a variable that can help when making multi key
|
||||
*/
|
||||
public var strumAnimPrefix = ["left", "down", "up", "right"];
|
||||
/**
|
||||
@@ -153,7 +153,7 @@ class StrumLine extends FlxTypedGroup<Strum> {
|
||||
if(scrollSpeed == null) if (PlayState.instance != null) scrollSpeed = PlayState.instance.scrollSpeed;
|
||||
if(scrollSpeed == null) scrollSpeed = 1;
|
||||
|
||||
// TODO: Make this work by accounting zoom and scrollspeed changes - Nex
|
||||
// TODO: Make this work by accounting zoom and scroll speed changes - Nex
|
||||
/*var limit = FlxG.height / 0.45;
|
||||
notes.limit = limit / scrollSpeed;
|
||||
OR
|
||||
|
||||
@@ -35,7 +35,7 @@ class DialogueCutscene extends ScriptedCutscene {
|
||||
return curLine = val;
|
||||
}
|
||||
|
||||
// Backwards comapt funcs - Nex
|
||||
// Backwards compat funcs - Nex
|
||||
public function set_dialogueScript(val:Script) return script = val;
|
||||
public function get_dialogueScript() return script;
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ import haxe.xml.Access;
|
||||
class DialogueBox extends FunkinSprite {
|
||||
public var dialogueBoxData:Access;
|
||||
public var positions:Map<String, CharPosDef> = [];
|
||||
public var dialogueEnded:Bool = false; // Using text._typing is also fair but it doesnt check for eventual opening anims! - Nex
|
||||
public var dialogueEnded:Bool = false; // Using text._typing is also fair but it doesn't check for eventual opening anims! - Nex
|
||||
|
||||
public var nextSFX:String = Paths.sound('dialogue/next');
|
||||
public var defaultTextTypeSFX:Array<FlxSound>;
|
||||
@@ -22,7 +22,7 @@ class DialogueBox extends FunkinSprite {
|
||||
|
||||
public function new(name:String) {
|
||||
super();
|
||||
var textTypeSFX:String = Paths.sound('dialogue/text'); // Default if xml doesnt have it - Nex
|
||||
var textTypeSFX:String = Paths.sound('dialogue/text'); // Default if xml doesn't have it - Nex
|
||||
|
||||
dialogueBoxScript = Script.create(Paths.script('data/' + defPath + name));
|
||||
dialogueBoxScript.setParent(this);
|
||||
|
||||
@@ -14,7 +14,7 @@ using StringTools;
|
||||
class FreeplayState extends MusicBeatState
|
||||
{
|
||||
/**
|
||||
* Array containing all of the songs metadatas
|
||||
* Array containing all of the songs' metadata.
|
||||
*/
|
||||
public var songs:Array<ChartMetaData> = [];
|
||||
|
||||
@@ -144,7 +144,7 @@ class FreeplayState extends MusicBeatState
|
||||
add(icon);
|
||||
|
||||
// songText.x += 40;
|
||||
// DONT PUT X IN THE FIRST PARAMETER OF new ALPHABET() !!
|
||||
// DON'T PUT X IN THE FIRST PARAMETER OF new ALPHABET() !!
|
||||
// songText.screenCenter(X);
|
||||
}
|
||||
|
||||
|
||||
@@ -162,7 +162,7 @@ class MainMenuState extends MusicBeatState
|
||||
{
|
||||
case 'story mode': FlxG.switchState(new StoryMenuState());
|
||||
case 'freeplay': FlxG.switchState(new FreeplayState());
|
||||
case 'donate', 'credits': FlxG.switchState(new CreditsMain()); // kept donate for not breaking scripts, if you dont want donate to bring you to the credits menu, thats easy softcodable - Nex
|
||||
case 'donate', 'credits': FlxG.switchState(new CreditsMain()); // kept donate for not breaking scripts, if you don't want donate to bring you to the credits menu, thats easy softcodable - Nex
|
||||
case 'options': FlxG.switchState(new OptionsMenu());
|
||||
}
|
||||
});
|
||||
|
||||
@@ -10,7 +10,7 @@ class FunkinSoundTray extends FlxSoundTray
|
||||
{
|
||||
public var script:Script;
|
||||
|
||||
// Neeo wanted them since it would reduce lags for some people if activated - Nex
|
||||
// Ne_Eo wanted them since it would reduce lags for some people if activated - Nex
|
||||
public var callsUpdate:Bool = true;
|
||||
public var callsPostUpdate:Bool = true;
|
||||
|
||||
|
||||
@@ -66,7 +66,7 @@ class Options
|
||||
public static var charterAutoSaves:Bool = true;
|
||||
public static var charterAutoSaveTime:Float = 60*5;
|
||||
public static var charterAutoSaveWarningTime:Float = 5;
|
||||
public static var charterAutoSavesSeperateFolder:Bool = false;
|
||||
public static var charterAutoSavesSeparateFolder:Bool = false;
|
||||
|
||||
/**
|
||||
* PLAYER 1 CONTROLS
|
||||
|
||||
@@ -13,11 +13,11 @@ class AppearanceOptions extends OptionsScreen {
|
||||
__changeFPS)); // callback
|
||||
add(new Checkbox(
|
||||
"Antialiasing",
|
||||
"If unchecked, will disable antialiasing on every sprite. Can boost performances at the cost of sharper, more pixely sprites.",
|
||||
"If unchecked, will disable antialiasing on every sprite. Can boost performances at the cost of sharper, more pixelated sprites.",
|
||||
"antialiasing"));
|
||||
add(new Checkbox(
|
||||
"Colored Healthbar",
|
||||
"If unchecked, the game will use the orginal red/green health bar from the week 6 fnf game.",
|
||||
"If unchecked, the game will use the original red/green health bar from the week 6 fnf game.",
|
||||
"colorHealthBar"));
|
||||
add(new Checkbox(
|
||||
"Pixel Perfect Effect",
|
||||
|
||||
@@ -49,7 +49,7 @@ class GithubUserIcon extends FlxSprite
|
||||
}
|
||||
|
||||
final mutex = new sys.thread.Mutex();
|
||||
override function drawComplex(camera:FlxCamera):Void { // Making the image downlaod only if the player actually sees it on the screeeeen - Nex
|
||||
override function drawComplex(camera:FlxCamera):Void { // Making the image download only if the player actually sees it on the screen - Nex
|
||||
if(waitUntilLoad <= 0) {
|
||||
waitUntilLoad = null;
|
||||
Main.execAsync(function() {
|
||||
|
||||
Reference in New Issue
Block a user