From 41ebe30677db2eb574cfc2bc824eba4a714cbfb4 Mon Sep 17 00:00:00 2001 From: Yoshman29 <81191621+YoshiCrafter29@users.noreply.github.com> Date: Tue, 20 Dec 2022 22:22:35 +0100 Subject: [PATCH] updater is done --- buildnumber.txt | 2 +- source/funkin/system/CoolUtil.hx | 4 +-- source/funkin/updating/AsyncUpdater.hx | 22 +++++++++++++-- source/funkin/updating/UpdateScreen.hx | 37 ++++++++++++++++++++++++++ 4 files changed, 60 insertions(+), 5 deletions(-) diff --git a/buildnumber.txt b/buildnumber.txt index 6059c637..7dbc594e 100644 --- a/buildnumber.txt +++ b/buildnumber.txt @@ -1 +1 @@ -1590 \ No newline at end of file +1596 \ No newline at end of file diff --git a/source/funkin/system/CoolUtil.hx b/source/funkin/system/CoolUtil.hx index d27bdf98..b79a2403 100644 --- a/source/funkin/system/CoolUtil.hx +++ b/source/funkin/system/CoolUtil.hx @@ -68,7 +68,7 @@ class CoolUtil return str; } - public static function getSizeString(size:UInt):String { + public static function getSizeString(size:Float):String { var labels = ["B", "KB", "MB", "GB", "TB"]; var rSize:Float = size; var label:Int = 0; @@ -76,7 +76,7 @@ class CoolUtil label++; rSize /= 1024; } - return '${FlxMath.roundDecimal(rSize, 2)}${labels[label]}'; + return '${Std.int(rSize) + "." + addZeros(Std.string(Math.round((rSize % 1) * 100)), 2)}${labels[label]}'; } public static function fpsLerp(v1:Float, v2:Float, ratio:Float):Float { diff --git a/source/funkin/updating/AsyncUpdater.hx b/source/funkin/updating/AsyncUpdater.hx index 6e43413f..236748af 100644 --- a/source/funkin/updating/AsyncUpdater.hx +++ b/source/funkin/updating/AsyncUpdater.hx @@ -1,5 +1,6 @@ package funkin.updating; +import openfl.Lib; import sys.io.Process; import haxe.zip.Reader; import funkin.system.ZipUtils; @@ -41,6 +42,9 @@ class AsyncUpdater { public var path:String; public var downloadStream:URLLoader; public var executableReplaced:Bool = false; + + public var lastTime:Float = 0; + public var oldBytesLoaded:Float = 0; public function installUpdates() { prepareInstallationEnvironment(); @@ -84,12 +88,14 @@ class AsyncUpdater { } } } - progress.curFile = 0; + progress.curFile = -1; + progress.curFileName = null; progress.files = files.length; progress.step = DOWNLOADING_ASSETS; trace('starting assets download'); doFile([for(e in files) e], [for(e in fileNames) e], function() { - progress.curFile = 0; + progress.curFile = -1; + progress.curFileName = null; progress.files = 1; progress.step = DOWNLOADING_EXECUTABLE; trace('starting exe download'); @@ -110,6 +116,7 @@ class AsyncUpdater { var fn = fileNames.shift(); trace('downloading $f ($fn)'); progress.curFile++; + progress.curFileName = fn; progress.bytesLoaded = 0; progress.bytesTotal = 1; downloadStream = new URLLoader(); @@ -118,6 +125,13 @@ class AsyncUpdater { downloadStream.addEventListener(ProgressEvent.PROGRESS, function(e) { progress.bytesLoaded = e.bytesLoaded; progress.bytesTotal = e.bytesTotal; + + var curTime = Lib.getTimer(); + + progress.downloadSpeed = (e.bytesLoaded - oldBytesLoaded) / ((curTime - lastTime) / 1000); + + lastTime = curTime; + oldBytesLoaded = e.bytesLoaded; }); downloadStream.addEventListener(Event.COMPLETE, function(e) { var fileOutput:FileOutput = File.write('$path$fn', true); @@ -131,6 +145,8 @@ class AsyncUpdater { doFile(files, fileNames, onFinish); }); + oldBytesLoaded = 0; + lastTime = Lib.getTimer(); downloadStream.load(new URLRequest(f)); } @@ -153,6 +169,8 @@ class UpdaterProgress { public var files:Int = 0; public var bytesLoaded:Float = 0; public var bytesTotal:Float = 0; + public var downloadSpeed:Float = 0; + public var curFileName:String = ""; public var done:Bool = false; public var curZipProgress:ZipProgress = new ZipProgress(); diff --git a/source/funkin/updating/UpdateScreen.hx b/source/funkin/updating/UpdateScreen.hx index e793d32e..557a9b58 100644 --- a/source/funkin/updating/UpdateScreen.hx +++ b/source/funkin/updating/UpdateScreen.hx @@ -1,5 +1,7 @@ package funkin.updating; +import flixel.util.FlxDestroyUtil; +import funkin.ui.FunkinText; import funkin.menus.TitleState; import flixel.math.FlxRect; import flixel.system.FlxSound; @@ -15,8 +17,13 @@ class UpdateScreen extends MusicBeatState { public var bf:FlxSprite; public var done:Bool = false; + public var elapsedTime:Float = 0; + public var lerpSpeed:Float = 0; public var overSound:FlxSound; + public var generalProgress:FunkinText; + public var partProgress:FunkinText; + public function new(check:UpdateCheckCallback) { super(false); updater = new AsyncUpdater(check.updates); @@ -39,6 +46,16 @@ class UpdateScreen extends MusicBeatState { bf.screenCenter(); add(bf); + partProgress = new FunkinText(0, progressBar.y, FlxG.width, "-\n-", 20); + partProgress.y -= partProgress.height; + partProgress.alignment = CENTER; + add(partProgress); + + generalProgress = new FunkinText(0, partProgress.y - 10, FlxG.width, "", 32); + generalProgress.y -= generalProgress.height; + generalProgress.alignment = CENTER; + add(generalProgress); + overSound = FlxG.sound.load(Paths.sound('gameOverEnd')); updater.execute(); @@ -47,17 +64,30 @@ class UpdateScreen extends MusicBeatState { public override function update(elapsed:Float) { super.update(elapsed); + + elapsedTime += elapsed; + progressBar.y = FlxG.height - (60 + (Math.sin(elapsedTime * Math.PI / 2) * 15)); + if (done) return; + var prog = updater.progress; + lerpSpeed = lerp(lerpSpeed, prog.downloadSpeed, 1/16); switch(prog.step) { case PREPARING: progressBar.value = 0; + generalProgress.text = "Preparing update installation... (1/4)"; + partProgress.text = "Creating installation folder and cleaning old update files..."; case DOWNLOADING_ASSETS: progressBar.value = 1 + ((prog.curFile-1+(prog.bytesLoaded/prog.bytesTotal)) / prog.files); + generalProgress.text = "Download update assets... (2/4)"; + partProgress.text = 'Downloading file ${prog.curFileName}\n(${prog.curFile+1}/${prog.files} | ${CoolUtil.getSizeString(prog.bytesLoaded)} / ${CoolUtil.getSizeString(prog.bytesTotal)} | ${CoolUtil.getSizeString(lerpSpeed)}/s)'; case DOWNLOADING_EXECUTABLE: progressBar.value = 2 + (prog.bytesLoaded/prog.bytesTotal); + generalProgress.text = "Download new engine executable... (3/4)"; + partProgress.text = 'Downloading ${prog.curFileName}\n(${CoolUtil.getSizeString(prog.bytesLoaded)} / ${CoolUtil.getSizeString(prog.bytesTotal)} | ${CoolUtil.getSizeString(lerpSpeed)}/s)'; case INSTALLING: progressBar.value = 3 + ((prog.curFile-1+(prog.curZipProgress.curFile/prog.curZipProgress.fileCount))/prog.files); + generalProgress.text = "Installing new files... (4/4)"; } var rect = new FlxRect(0, (1 - (progressBar.value / 4)) * bf.frameHeight, bf.frameWidth, 0); rect.height = bf.frameHeight - rect.y; @@ -68,9 +98,16 @@ class UpdateScreen extends MusicBeatState { // update is done, play bf's anim FlxG.sound.music.stop(); overSound.play(); + + remove(generalProgress); + remove(partProgress); + generalProgress = FlxDestroyUtil.destroy(generalProgress); + partProgress = FlxDestroyUtil.destroy(partProgress); + bf.animation.curAnim.frameRate = 24; bf.animation.play("loading-anim", true, false, 1); bf.alpha = 1; + FlxG.camera.fade(0xFF000000, overSound.length / 1000, false, function() { if (updater.executableReplaced) { // the executable has been replaced, restart the game entirely