Compare commits

...

16 commits

Author SHA1 Message Date
Kade
b094810eaf
Merge a87615ff7c into 0d8e4a5330 2024-11-15 20:14:34 +00:00
Cameron Taylor
0d8e4a5330
fix: re-enable precise chart editor scrolling, and also fix smooth scroll playhead/playbar playback (#3806) 2024-10-30 12:41:28 -04:00
Cameron Taylor
6321983eba assets submod 2024-10-28 14:27:00 -04:00
Cameron Taylor
101b9f59b3 assets submod 2024-10-28 14:24:30 -04:00
Keoiki
e570dfb8e7
fix: Fix beat/step ticks sometimes not appearing on non-4/4 time signatures in chart editor (#2860)
Beat and step ticks now appear fully on 5/4, 6/4 and 9/8 time signatures.
2024-10-26 16:11:49 -04:00
Hyper_
e6b6b41766
revert: "[BUGFIX?] Reset CWD before Preloader" (#3538) 2024-10-26 16:03:42 -04:00
Cameron Taylor
090ddd1f1c fix: fixes the initial camera position on the debug menu 2024-10-26 15:59:13 -04:00
Abnormal
76c8c8b520
docs: Fix a 'ludem' -> 'ludum' typo in CHANGELOG.md 2024-10-26 15:58:12 -04:00
Cameron Taylor
20d9016984 feat: Added smoother scrolling when using the Chart Editor
smoother drag / movement in chart editor

playbarHead movement fixie
2024-10-26 15:54:15 -04:00
Cameron Taylor
144ba00377 refactor: remove commented out code from draw() in PlayState.hx 2024-10-26 15:53:22 -04:00
Cameron Taylor
7159cad2c1 style: remove a buncho unused imports from PlayState.hx 2024-10-26 15:51:38 -04:00
Eric
62de2a0345
...sandwiches. 2024-10-23 13:40:35 -04:00
Eric
8cf346c3b0
Update CHANGELOG.md 2024-10-22 20:36:10 -04:00
Cameron Taylor
a0cefba9fd changelog yoink 2024-10-22 12:14:14 -04:00
Kade
a87615ff7c
also account for instrumental offset
It seems that it is tied to both of them
2024-09-17 15:58:58 -07:00
Kade
caa4d290f7
offset the visual position of waveforms 2024-09-17 15:33:17 -07:00
8 changed files with 87 additions and 171 deletions

View file

@ -4,6 +4,17 @@ All notable changes will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [0.5.3] - 2024-10-18
This patch resolves a critical issue which could cause user's save data to become corrupted. It is recommended that users switch to this version immediately and avoid using version 0.5.2.
### Fixed
- Fixed a critical issue in which the Stage Editor theme value could not be parsed by older versions of the game, resulting in all save data being destroyed.
- Added a check which prevents save data from being loaded if it is corrupted rather than overriding it.
- `optionsStageEditor.theme` in the save data converted from an Enum to a String to fix save data compatibility issues.
- In the future, Enum values should not be used in order to prevent incompatibilities caused by introducing new types to the save data that older versions cannot parse.
- `optionsChartEditor.theme` in the save data converted from an Enum to a String to fix save data compatibility issues.
- `optionsChartEditor.chartEditorLiveInputStyle` in the save data converted from an Enum to a String to fix save data compatibility issues.
- Fixed an issue where some publicly distributed builds of the game were debug builds instead of release builds.
## [0.5.2] - 2024-10-11 ## [0.5.2] - 2024-10-11
### Changed ### Changed
@ -371,7 +382,7 @@ which would remove their rank if they had a lower one.
- Improvements to video cutscenes and dialogue, allowing them to be easily skipped or restarted. - Improvements to video cutscenes and dialogue, allowing them to be easily skipped or restarted.
- Updated Polymod by several major versions, allowing for fully dynamic asset replacement and support for scripted classes. - Updated Polymod by several major versions, allowing for fully dynamic asset replacement and support for scripted classes.
- Completely refactored almost every part of the game's code for performance, stability, and extensibility. - Completely refactored almost every part of the game's code for performance, stability, and extensibility.
- This is not the Ludem Dare game held together with sticks and glue you played three years ago. - This is not the Ludum Dare game held together with sticks and glue you played three years ago.
- Characters, stages, songs, story levels, and dialogue are now built from JSON data registries rather than being hardcoded. - Characters, stages, songs, story levels, and dialogue are now built from JSON data registries rather than being hardcoded.
- All of these also support attaching scripts for custom behavior, more documentation on this soon. - All of these also support attaching scripts for custom behavior, more documentation on this soon.
- You can forcibly reload the game's JSON data and scripts by pressing F5. - You can forcibly reload the game's JSON data and scripts by pressing F5.

2
art

@ -1 +1 @@
Subproject commit fbd3e3df77734606d88516770b71b56e6fa04bce Subproject commit 66572f85d826ce2ec1d45468c12733b161237ffa

2
assets

@ -1 +1 @@
Subproject commit 4abd6cc06e56c6d56440fa858262932db118250c Subproject commit c1899ffbefb9a7c98b030c75a33623431d7ea6ba

View file

@ -1,17 +1,13 @@
package funkin.play; package funkin.play;
import flixel.addons.display.FlxPieDial;
import flixel.addons.transition.FlxTransitionableState; import flixel.addons.transition.FlxTransitionableState;
import flixel.addons.transition.Transition; import flixel.addons.transition.Transition;
import flixel.FlxCamera; import flixel.FlxCamera;
import flixel.FlxObject; import flixel.FlxObject;
import flixel.FlxState;
import flixel.FlxSubState; import flixel.FlxSubState;
import flixel.math.FlxMath; import flixel.math.FlxMath;
import flixel.math.FlxPoint; import flixel.math.FlxPoint;
import flixel.math.FlxRect;
import flixel.text.FlxText; import flixel.text.FlxText;
import flixel.tweens.FlxEase;
import flixel.tweens.FlxTween; import flixel.tweens.FlxTween;
import flixel.ui.FlxBar; import flixel.ui.FlxBar;
import flixel.util.FlxColor; import flixel.util.FlxColor;
@ -22,7 +18,6 @@ import funkin.audio.FunkinSound;
import funkin.audio.VoicesGroup; import funkin.audio.VoicesGroup;
import funkin.data.dialogue.conversation.ConversationRegistry; import funkin.data.dialogue.conversation.ConversationRegistry;
import funkin.data.event.SongEventRegistry; import funkin.data.event.SongEventRegistry;
import funkin.data.notestyle.NoteStyleData;
import funkin.data.notestyle.NoteStyleRegistry; import funkin.data.notestyle.NoteStyleRegistry;
import funkin.data.song.SongData.SongCharacterData; import funkin.data.song.SongData.SongCharacterData;
import funkin.data.song.SongData.SongEventData; import funkin.data.song.SongData.SongEventData;
@ -45,7 +40,6 @@ import funkin.play.cutscene.VanillaCutscenes;
import funkin.play.cutscene.VideoCutscene; import funkin.play.cutscene.VideoCutscene;
import funkin.play.notes.NoteDirection; import funkin.play.notes.NoteDirection;
import funkin.play.notes.notekind.NoteKindManager; import funkin.play.notes.notekind.NoteKindManager;
import funkin.play.notes.NoteSplash;
import funkin.play.notes.NoteSprite; import funkin.play.notes.NoteSprite;
import funkin.play.notes.notestyle.NoteStyle; import funkin.play.notes.notestyle.NoteStyle;
import funkin.play.notes.Strumline; import funkin.play.notes.Strumline;
@ -58,15 +52,9 @@ import funkin.ui.debug.charting.ChartEditorState;
import funkin.ui.debug.stage.StageOffsetSubState; import funkin.ui.debug.stage.StageOffsetSubState;
import funkin.ui.mainmenu.MainMenuState; import funkin.ui.mainmenu.MainMenuState;
import funkin.ui.MusicBeatSubState; import funkin.ui.MusicBeatSubState;
import funkin.ui.options.PreferencesMenu;
import funkin.ui.story.StoryMenuState;
import funkin.ui.transition.LoadingState; import funkin.ui.transition.LoadingState;
import funkin.util.SerializerUtil; import funkin.util.SerializerUtil;
import haxe.Int64; import haxe.Int64;
import lime.ui.Haptic;
import openfl.display.BitmapData;
import openfl.geom.Rectangle;
import openfl.Lib;
#if FEATURE_DISCORD_RPC #if FEATURE_DISCORD_RPC
import funkin.api.discord.DiscordClient; import funkin.api.discord.DiscordClient;
#end #end
@ -760,24 +748,6 @@ class PlayState extends MusicBeatSubState
refresh(); refresh();
} }
public override function draw():Void
{
// if (FlxG.renderBlit)
// {
// camGame.fill(BACKGROUND_COLOR);
// }
// else if (FlxG.renderTile)
// {
// FlxG.log.warn("PlayState background not displayed properly on tile renderer!");
// }
// else
// {
// FlxG.log.warn("PlayState background not displayed properly, unknown renderer!");
// }
super.draw();
}
function assertChartExists():Bool function assertChartExists():Bool
{ {
// Returns null if the song failed to load or doesn't have the selected difficulty. // Returns null if the song failed to load or doesn't have the selected difficulty.

View file

@ -67,6 +67,7 @@ class DebugMenuSubState extends MusicBeatSubState
#if sys #if sys
createItem("OPEN CRASH LOG FOLDER", openLogFolder); createItem("OPEN CRASH LOG FOLDER", openLogFolder);
#end #end
onMenuChange(items.members[0]);
FlxG.camera.focusOn(new FlxPoint(camFocusPoint.x, camFocusPoint.y + 500)); FlxG.camera.focusOn(new FlxPoint(camFocusPoint.x, camFocusPoint.y + 500));
} }

View file

@ -94,6 +94,7 @@ import funkin.ui.mainmenu.MainMenuState;
import funkin.ui.transition.LoadingState; import funkin.ui.transition.LoadingState;
import funkin.util.Constants; import funkin.util.Constants;
import funkin.util.FileUtil; import funkin.util.FileUtil;
import funkin.util.MathUtil;
import funkin.util.logging.CrashHandler; import funkin.util.logging.CrashHandler;
import funkin.util.SortUtil; import funkin.util.SortUtil;
import funkin.util.WindowUtil; import funkin.util.WindowUtil;
@ -244,7 +245,7 @@ class ChartEditorState extends UIState // UIState derives from MusicBeatState
/** /**
* Duration, in seconds, for the scroll easing animation. * Duration, in seconds, for the scroll easing animation.
*/ */
public static final SCROLL_EASE_DURATION:Float = 0.2; public static final SCROLL_EASE_DURATION:Float = 0.4;
// Other // Other
@ -403,11 +404,18 @@ class ChartEditorState extends UIState // UIState derives from MusicBeatState
{ {
gridTiledSprite.y = -scrollPositionInPixels + (GRID_INITIAL_Y_POS); gridTiledSprite.y = -scrollPositionInPixels + (GRID_INITIAL_Y_POS);
measureTicks.y = gridTiledSprite.y; measureTicks.y = gridTiledSprite.y;
var id = 0;
for (member in audioWaveforms.members) for (member in audioWaveforms.members)
{ {
member.time = scrollPositionInMs / Constants.MS_PER_SEC; if (id == 1)
{
member.time = ((scrollPositionInMs - currentVocalOffsetOpponent) - currentInstrumentalOffset) / Constants.MS_PER_SEC;
}
else
{
member.time = ((scrollPositionInMs - currentVocalOffsetOpponent) - currentInstrumentalOffset) / Constants.MS_PER_SEC;
}
id++;
// Doing this desyncs the waveforms from the grid. // Doing this desyncs the waveforms from the grid.
// member.y = Math.max(this.gridTiledSprite?.y ?? 0.0, ChartEditorState.GRID_INITIAL_Y_POS - ChartEditorState.GRID_TOP_PAD); // member.y = Math.max(this.gridTiledSprite?.y ?? 0.0, ChartEditorState.GRID_INITIAL_Y_POS - ChartEditorState.GRID_TOP_PAD);
} }
@ -773,9 +781,8 @@ class ChartEditorState extends UIState // UIState derives from MusicBeatState
/** /**
* The current process that is lerping the scroll position. * The current process that is lerping the scroll position.
* Used to cancel the previous lerp if the user scrolls again.
*/ */
var currentScrollEase:Null<VarTween>; var currentScrollEase:Null<Float>;
/** /**
* The position where the user middle clicked to place a scroll anchor. * The position where the user middle clicked to place a scroll anchor.
@ -2707,6 +2714,7 @@ class ChartEditorState extends UIState // UIState derives from MusicBeatState
playbarHeadLayout.playbarHead.width = FlxG.width; playbarHeadLayout.playbarHead.width = FlxG.width;
playbarHeadLayout.playbarHead.height = 10; playbarHeadLayout.playbarHead.height = 10;
playbarHeadLayout.playbarHead.styleString = 'padding-left: 0px; padding-right: 0px; border-left: 0px; border-right: 0px;'; playbarHeadLayout.playbarHead.styleString = 'padding-left: 0px; padding-right: 0px; border-left: 0px; border-right: 0px;';
playbarHeadLayout.playbarHead.min = 0;
playbarHeadLayout.playbarHead.onDragStart = function(_:DragEvent) { playbarHeadLayout.playbarHead.onDragStart = function(_:DragEvent) {
playbarHeadDragging = true; playbarHeadDragging = true;
@ -2723,13 +2731,12 @@ class ChartEditorState extends UIState // UIState derives from MusicBeatState
} }
} }
playbarHeadLayout.playbarHead.onDrag = function(_:DragEvent) { playbarHeadLayout.playbarHead.onDrag = function(d:DragEvent) {
if (playbarHeadDragging) if (playbarHeadDragging)
{ {
// Set the song position to where the playhead was moved to.
scrollPositionInPixels = (songLengthInPixels) * playbarHeadLayout.playbarHead.value / 100;
// Update the conductor and audio tracks to match. // Update the conductor and audio tracks to match.
moveSongToScrollPosition(); currentScrollEase = d.value;
easeSongToScrollPosition(currentScrollEase);
} }
} }
@ -2740,8 +2747,9 @@ class ChartEditorState extends UIState // UIState derives from MusicBeatState
if (playbarHeadDraggingWasPlaying) if (playbarHeadDraggingWasPlaying)
{ {
playbarHeadDraggingWasPlaying = false; playbarHeadDraggingWasPlaying = false;
// Disabled code to resume song playback on drag. // Disabled code to resume song playback on drag.
// startAudioPlayback(); startAudioPlayback();
} }
} }
@ -3417,10 +3425,14 @@ class ChartEditorState extends UIState // UIState derives from MusicBeatState
audioInstTrack.time = -Conductor.instance.instrumentalOffset; audioInstTrack.time = -Conductor.instance.instrumentalOffset;
} }
} }
if (!audioInstTrack.isPlaying && currentScrollEase != scrollPositionInPixels) easeSongToScrollPosition(currentScrollEase);
} }
if (audioInstTrack != null && audioInstTrack.isPlaying) if (audioInstTrack != null && audioInstTrack.isPlaying)
{ {
currentScrollEase = scrollPositionInPixels;
if (FlxG.keys.pressed.ALT) if (FlxG.keys.pressed.ALT)
{ {
// If middle mouse panning during song playback, we move ONLY the playhead, without scrolling. Neat! // If middle mouse panning during song playback, we move ONLY the playhead, without scrolling. Neat!
@ -3869,7 +3881,7 @@ class ChartEditorState extends UIState // UIState derives from MusicBeatState
} }
// Mouse Wheel = Scroll // Mouse Wheel = Scroll
if (FlxG.mouse.wheel != 0 && !FlxG.keys.pressed.CONTROL) if (FlxG.mouse.wheel != 0)
{ {
scrollAmount = -50 * FlxG.mouse.wheel; scrollAmount = -50 * FlxG.mouse.wheel;
shouldPause = true; shouldPause = true;
@ -4057,27 +4069,13 @@ class ChartEditorState extends UIState // UIState derives from MusicBeatState
shouldPause = true; shouldPause = true;
} }
if (Math.abs(scrollAmount) > GRID_SIZE * 8)
{
shouldEase = true; shouldEase = true;
} if (shouldPause) stopAudioPlayback();
// Resync the conductor and audio tracks. // Resync the conductor and audio tracks.
if (scrollAmount != 0 || playheadAmount != 0) if (playheadAmount != 0) this.playheadPositionInPixels += playheadAmount;
{
this.playheadPositionInPixels += playheadAmount; if (scrollAmount != 0) currentScrollEase += scrollAmount;
if (shouldEase)
{
easeSongToScrollPosition(this.scrollPositionInPixels + scrollAmount);
}
else
{
// Apply the scroll amount.
this.scrollPositionInPixels += scrollAmount;
moveSongToScrollPosition();
}
}
if (shouldPause) stopAudioPlayback();
} }
/** /**
@ -4333,15 +4331,13 @@ class ChartEditorState extends UIState // UIState derives from MusicBeatState
{ {
// Scroll up. // Scroll up.
var diff:Float = MENU_BAR_HEIGHT - FlxG.mouse.viewY; var diff:Float = MENU_BAR_HEIGHT - FlxG.mouse.viewY;
scrollPositionInPixels -= diff * 0.5; // Too fast! currentScrollEase -= diff * 0.5; // Too fast!
moveSongToScrollPosition();
} }
else if (FlxG.mouse.viewY > (playbarHeadLayout?.y ?? 0.0)) else if (FlxG.mouse.viewY > (playbarHeadLayout?.y ?? 0.0))
{ {
// Scroll down. // Scroll down.
var diff:Float = FlxG.mouse.viewY - (playbarHeadLayout?.y ?? 0.0); var diff:Float = FlxG.mouse.viewY - (playbarHeadLayout?.y ?? 0.0);
scrollPositionInPixels += diff * 0.5; // Too fast! currentScrollEase += (diff * 0.5); // Too fast!
moveSongToScrollPosition();
} }
// Render the selection box. // Render the selection box.
@ -4480,8 +4476,8 @@ class ChartEditorState extends UIState // UIState derives from MusicBeatState
var clickedPosInPixels:Float = FlxMath.remapToRange(FlxG.mouse.viewY, (notePreview?.y ?? 0.0), (notePreview?.y ?? 0.0) + (notePreview?.height ?? 0.0), var clickedPosInPixels:Float = FlxMath.remapToRange(FlxG.mouse.viewY, (notePreview?.y ?? 0.0), (notePreview?.y ?? 0.0) + (notePreview?.height ?? 0.0),
0, songLengthInPixels); 0, songLengthInPixels);
scrollPositionInPixels = clickedPosInPixels; currentScrollEase = clickedPosInPixels;
moveSongToScrollPosition(); easeSongToScrollPosition(currentScrollEase);
} }
else if (scrollAnchorScreenPos != null) else if (scrollAnchorScreenPos != null)
{ {
@ -4540,15 +4536,13 @@ class ChartEditorState extends UIState // UIState derives from MusicBeatState
{ {
// Scroll up. // Scroll up.
var diff:Float = MENU_BAR_HEIGHT - FlxG.mouse.viewY; var diff:Float = MENU_BAR_HEIGHT - FlxG.mouse.viewY;
scrollPositionInPixels -= diff * 0.5; // Too fast! currentScrollEase -= (diff * 0.5);
moveSongToScrollPosition();
} }
else if (FlxG.mouse.viewY > (playbarHeadLayout?.y ?? 0.0)) else if (FlxG.mouse.viewY > (playbarHeadLayout?.y ?? 0.0))
{ {
// Scroll down. // Scroll down.
var diff:Float = FlxG.mouse.viewY - (playbarHeadLayout?.y ?? 0.0); var diff:Float = FlxG.mouse.viewY - (playbarHeadLayout?.y ?? 0.0);
scrollPositionInPixels += diff * 0.5; // Too fast! currentScrollEase += (diff * 0.5);
moveSongToScrollPosition();
} }
// Calculate distance between the position dragged to and the original position. // Calculate distance between the position dragged to and the original position.
@ -5142,18 +5136,15 @@ class ChartEditorState extends UIState // UIState derives from MusicBeatState
{ {
if (playbarHeadLayout == null) throw "ERROR: Tried to handle playbar, but playbarHeadLayout is null!"; if (playbarHeadLayout == null) throw "ERROR: Tried to handle playbar, but playbarHeadLayout is null!";
// Move the playhead to match the song position, if we aren't dragging it.
playbarHeadLayout.playbarHead.pos = currentScrollEase;
playbarHeadLayout.playbarHead.max = songLengthInPixels;
// Make sure the playbar is never nudged out of the correct spot. // Make sure the playbar is never nudged out of the correct spot.
playbarHeadLayout.x = 4; playbarHeadLayout.x = 4;
playbarHeadLayout.y = FlxG.height - 48 - 8; playbarHeadLayout.y = FlxG.height - 48 - 8;
// Move the playhead to match the song position, if we aren't dragging it.
if (!playbarHeadDragging)
{
var songPosPercent = scrollPositionInPixels / (songLengthInPixels) * 100;
if (playbarHeadLayout.playbarHead.value != songPosPercent) playbarHeadLayout.playbarHead.value = songPosPercent;
}
var songPos:Float = Conductor.instance.songPosition + Conductor.instance.instrumentalOffset; var songPos:Float = Conductor.instance.songPosition + Conductor.instance.instrumentalOffset;
var songPosMilliseconds:String = Std.string(Math.floor(Math.abs(songPos) % 1000)).lpad('0', 2).substr(0, 2); var songPosMilliseconds:String = Std.string(Math.floor(Math.abs(songPos) % 1000)).lpad('0', 2).substr(0, 2);
var songPosSeconds:String = Std.string(Math.floor((Math.abs(songPos) / 1000) % 60)).lpad('0', 2); var songPosSeconds:String = Std.string(Math.floor((Math.abs(songPos) / 1000) % 60)).lpad('0', 2);
@ -6134,43 +6125,12 @@ class ChartEditorState extends UIState // UIState derives from MusicBeatState
*/ */
function easeSongToScrollPosition(targetScrollPosition:Float):Void function easeSongToScrollPosition(targetScrollPosition:Float):Void
{ {
if (currentScrollEase != null) cancelScrollEase(currentScrollEase); currentScrollEase = Math.max(0, targetScrollPosition);
currentScrollEase = Math.min(currentScrollEase, songLengthInPixels);
currentScrollEase = FlxTween.tween(this, {scrollPositionInPixels: targetScrollPosition}, SCROLL_EASE_DURATION, scrollPositionInPixels = MathUtil.smoothLerp(scrollPositionInPixels, currentScrollEase, FlxG.elapsed, SCROLL_EASE_DURATION, 1 / 1000);
{
ease: FlxEase.quintInOut,
onUpdate: this.onScrollEaseUpdate,
onComplete: this.cancelScrollEase,
type: ONESHOT
});
}
/**
* Callback function executed every frame that the scroll position is being eased.
* @param _
*/
function onScrollEaseUpdate(_:FlxTween):Void
{
moveSongToScrollPosition(); moveSongToScrollPosition();
} }
/**
* Callback function executed when cancelling an existing scroll position ease.
* Ensures that the ease is immediately cancelled and the scroll position is set to the target value.
*/
function cancelScrollEase(_:FlxTween):Void
{
if (currentScrollEase != null)
{
@:privateAccess
var targetScrollPosition:Float = currentScrollEase._properties.scrollPositionInPixels;
currentScrollEase.cancel();
currentScrollEase = null;
this.scrollPositionInPixels = targetScrollPosition;
}
}
/** /**
* Fix the current scroll position after exiting the PlayState used when testing. * Fix the current scroll position after exiting the PlayState used when testing.
*/ */
@ -6351,6 +6311,8 @@ class ChartEditorState extends UIState // UIState derives from MusicBeatState
{ {
if (audioInstTrack == null) return; if (audioInstTrack == null) return;
currentScrollEase = this.scrollPositionInPixels;
if (audioInstTrack.isPlaying) if (audioInstTrack.isPlaying)
{ {
// Pause // Pause

View file

@ -253,42 +253,23 @@ class ChartEditorThemeHandler
var bottomTickY:Float = state.measureTickBitmap.height - (measureTickWidth / 2); var bottomTickY:Float = state.measureTickBitmap.height - (measureTickWidth / 2);
state.measureTickBitmap.fillRect(new Rectangle(0, bottomTickY, state.measureTickBitmap.width, measureTickWidth / 2), GRID_MEASURE_DIVIDER_COLOR_LIGHT); state.measureTickBitmap.fillRect(new Rectangle(0, bottomTickY, state.measureTickBitmap.width, measureTickWidth / 2), GRID_MEASURE_DIVIDER_COLOR_LIGHT);
// Draw the beat ticks. // Draw the beat and step ticks. No need for two seperate loops thankfully.
var beatTick2Y:Float = state.measureTickBitmap.height * 1 / Conductor.instance.beatsPerMeasure - (beatTickWidth / 2); // This'll be fun to update when beat tuplets become functional.
var beatTick3Y:Float = state.measureTickBitmap.height * 2 / Conductor.instance.beatsPerMeasure - (beatTickWidth / 2); for (i in 1...(Conductor.instance.stepsPerMeasure))
var beatTick4Y:Float = state.measureTickBitmap.height * 3 / Conductor.instance.beatsPerMeasure - (beatTickWidth / 2); {
if ((i % Constants.STEPS_PER_BEAT) == 0) // If we're on a beat, draw a beat tick.
{
var beatTickY:Float = state.measureTickBitmap.height * i / Conductor.instance.stepsPerMeasure - (beatTickWidth / 2);
var beatTickLength:Float = state.measureTickBitmap.width * 2 / 3; var beatTickLength:Float = state.measureTickBitmap.width * 2 / 3;
state.measureTickBitmap.fillRect(new Rectangle(0, beatTick2Y, beatTickLength, beatTickWidth), GRID_MEASURE_DIVIDER_COLOR_LIGHT); state.measureTickBitmap.fillRect(new Rectangle(0, beatTickY, beatTickLength, beatTickWidth), GRID_MEASURE_DIVIDER_COLOR_LIGHT);
state.measureTickBitmap.fillRect(new Rectangle(0, beatTick3Y, beatTickLength, beatTickWidth), GRID_MEASURE_DIVIDER_COLOR_LIGHT); }
state.measureTickBitmap.fillRect(new Rectangle(0, beatTick4Y, beatTickLength, beatTickWidth), GRID_MEASURE_DIVIDER_COLOR_LIGHT); else // Else, draw a step tick.
{
// Draw the step ticks. var stepTickY:Float = state.measureTickBitmap.height * i / Conductor.instance.stepsPerMeasure - (stepTickWidth / 2);
// TODO: Make this a loop or something.
var stepTick2Y:Float = state.measureTickBitmap.height * 1 / Conductor.instance.stepsPerMeasure - (stepTickWidth / 2);
var stepTick3Y:Float = state.measureTickBitmap.height * 2 / Conductor.instance.stepsPerMeasure - (stepTickWidth / 2);
var stepTick4Y:Float = state.measureTickBitmap.height * 3 / Conductor.instance.stepsPerMeasure - (stepTickWidth / 2);
var stepTick6Y:Float = state.measureTickBitmap.height * 5 / Conductor.instance.stepsPerMeasure - (stepTickWidth / 2);
var stepTick7Y:Float = state.measureTickBitmap.height * 6 / Conductor.instance.stepsPerMeasure - (stepTickWidth / 2);
var stepTick8Y:Float = state.measureTickBitmap.height * 7 / Conductor.instance.stepsPerMeasure - (stepTickWidth / 2);
var stepTick10Y:Float = state.measureTickBitmap.height * 9 / Conductor.instance.stepsPerMeasure - (stepTickWidth / 2);
var stepTick11Y:Float = state.measureTickBitmap.height * 10 / Conductor.instance.stepsPerMeasure - (stepTickWidth / 2);
var stepTick12Y:Float = state.measureTickBitmap.height * 11 / Conductor.instance.stepsPerMeasure - (stepTickWidth / 2);
var stepTick14Y:Float = state.measureTickBitmap.height * 13 / Conductor.instance.stepsPerMeasure - (stepTickWidth / 2);
var stepTick15Y:Float = state.measureTickBitmap.height * 14 / Conductor.instance.stepsPerMeasure - (stepTickWidth / 2);
var stepTick16Y:Float = state.measureTickBitmap.height * 15 / Conductor.instance.stepsPerMeasure - (stepTickWidth / 2);
var stepTickLength:Float = state.measureTickBitmap.width * 1 / 3; var stepTickLength:Float = state.measureTickBitmap.width * 1 / 3;
state.measureTickBitmap.fillRect(new Rectangle(0, stepTick2Y, stepTickLength, stepTickWidth), GRID_MEASURE_DIVIDER_COLOR_LIGHT); state.measureTickBitmap.fillRect(new Rectangle(0, stepTickY, stepTickLength, stepTickWidth), GRID_MEASURE_DIVIDER_COLOR_LIGHT);
state.measureTickBitmap.fillRect(new Rectangle(0, stepTick3Y, stepTickLength, stepTickWidth), GRID_MEASURE_DIVIDER_COLOR_LIGHT); }
state.measureTickBitmap.fillRect(new Rectangle(0, stepTick4Y, stepTickLength, stepTickWidth), GRID_MEASURE_DIVIDER_COLOR_LIGHT); }
state.measureTickBitmap.fillRect(new Rectangle(0, stepTick6Y, stepTickLength, stepTickWidth), GRID_MEASURE_DIVIDER_COLOR_LIGHT);
state.measureTickBitmap.fillRect(new Rectangle(0, stepTick7Y, stepTickLength, stepTickWidth), GRID_MEASURE_DIVIDER_COLOR_LIGHT);
state.measureTickBitmap.fillRect(new Rectangle(0, stepTick8Y, stepTickLength, stepTickWidth), GRID_MEASURE_DIVIDER_COLOR_LIGHT);
state.measureTickBitmap.fillRect(new Rectangle(0, stepTick10Y, stepTickLength, stepTickWidth), GRID_MEASURE_DIVIDER_COLOR_LIGHT);
state.measureTickBitmap.fillRect(new Rectangle(0, stepTick11Y, stepTickLength, stepTickWidth), GRID_MEASURE_DIVIDER_COLOR_LIGHT);
state.measureTickBitmap.fillRect(new Rectangle(0, stepTick12Y, stepTickLength, stepTickWidth), GRID_MEASURE_DIVIDER_COLOR_LIGHT);
state.measureTickBitmap.fillRect(new Rectangle(0, stepTick14Y, stepTickLength, stepTickWidth), GRID_MEASURE_DIVIDER_COLOR_LIGHT);
state.measureTickBitmap.fillRect(new Rectangle(0, stepTick15Y, stepTickLength, stepTickWidth), GRID_MEASURE_DIVIDER_COLOR_LIGHT);
state.measureTickBitmap.fillRect(new Rectangle(0, stepTick16Y, stepTickLength, stepTickWidth), GRID_MEASURE_DIVIDER_COLOR_LIGHT);
} }
/** /**
@ -314,23 +295,16 @@ class ChartEditorThemeHandler
state.offsetTickBitmap.fillRect(new Rectangle(rightTickX, 0, majorTickWidth / 2, majorTickLength), GRID_MEASURE_DIVIDER_COLOR_LIGHT); state.offsetTickBitmap.fillRect(new Rectangle(rightTickX, 0, majorTickWidth / 2, majorTickLength), GRID_MEASURE_DIVIDER_COLOR_LIGHT);
// Draw the minor ticks. // Draw the minor ticks.
var minorTick2X:Float = state.offsetTickBitmap.width * 1 / 10 - (minorTickWidth / 2); for (i in 1...11)
var minorTick3X:Float = state.offsetTickBitmap.width * 2 / 10 - (minorTickWidth / 2); {
var minorTick4X:Float = state.offsetTickBitmap.width * 3 / 10 - (minorTickWidth / 2); if (i % 5 == 0)
var minorTick5X:Float = state.offsetTickBitmap.width * 4 / 10 - (minorTickWidth / 2); {
var minorTick7X:Float = state.offsetTickBitmap.width * 6 / 10 - (minorTickWidth / 2); continue;
var minorTick8X:Float = state.offsetTickBitmap.width * 7 / 10 - (minorTickWidth / 2); }
var minorTick9X:Float = state.offsetTickBitmap.width * 8 / 10 - (minorTickWidth / 2); var minorTickX:Float = state.offsetTickBitmap.width * i / 10 - (minorTickWidth / 2);
var minorTick10X:Float = state.offsetTickBitmap.width * 9 / 10 - (minorTickWidth / 2);
var minorTickLength:Float = state.offsetTickBitmap.height * 1 / 3; var minorTickLength:Float = state.offsetTickBitmap.height * 1 / 3;
state.offsetTickBitmap.fillRect(new Rectangle(minorTick2X, 0, minorTickWidth, minorTickLength), GRID_MEASURE_DIVIDER_COLOR_LIGHT); state.offsetTickBitmap.fillRect(new Rectangle(minorTickX, 0, minorTickWidth, minorTickLength), GRID_MEASURE_DIVIDER_COLOR_LIGHT);
state.offsetTickBitmap.fillRect(new Rectangle(minorTick3X, 0, minorTickWidth, minorTickLength), GRID_MEASURE_DIVIDER_COLOR_LIGHT); }
state.offsetTickBitmap.fillRect(new Rectangle(minorTick4X, 0, minorTickWidth, minorTickLength), GRID_MEASURE_DIVIDER_COLOR_LIGHT);
state.offsetTickBitmap.fillRect(new Rectangle(minorTick5X, 0, minorTickWidth, minorTickLength), GRID_MEASURE_DIVIDER_COLOR_LIGHT);
state.offsetTickBitmap.fillRect(new Rectangle(minorTick7X, 0, minorTickWidth, minorTickLength), GRID_MEASURE_DIVIDER_COLOR_LIGHT);
state.offsetTickBitmap.fillRect(new Rectangle(minorTick8X, 0, minorTickWidth, minorTickLength), GRID_MEASURE_DIVIDER_COLOR_LIGHT);
state.offsetTickBitmap.fillRect(new Rectangle(minorTick9X, 0, minorTickWidth, minorTickLength), GRID_MEASURE_DIVIDER_COLOR_LIGHT);
state.offsetTickBitmap.fillRect(new Rectangle(minorTick10X, 0, minorTickWidth, minorTickLength), GRID_MEASURE_DIVIDER_COLOR_LIGHT);
// Draw the offset ticks. // Draw the offset ticks.
// var ticksWidth:Int = Std.int(ChartEditorState.GRID_SIZE * TOTAL_COLUMN_COUNT); // 1 grid squares wide. // var ticksWidth:Int = Std.int(ChartEditorState.GRID_SIZE * TOTAL_COLUMN_COUNT); // 1 grid squares wide.

View file

@ -136,8 +136,6 @@ class FunkinPreloader extends FlxBasePreloader
// We can't even call trace() yet, until Flixel loads. // We can't even call trace() yet, until Flixel loads.
trace('Initializing custom preloader...'); trace('Initializing custom preloader...');
funkin.util.CLIUtil.resetWorkingDir();
this.siteLockTitleText = Constants.SITE_LOCK_TITLE; this.siteLockTitleText = Constants.SITE_LOCK_TITLE;
this.siteLockBodyText = Constants.SITE_LOCK_DESC; this.siteLockBodyText = Constants.SITE_LOCK_DESC;
} }