@@ -364,116 +364,87 @@ class UpdateSubState extends FlxSubState
364364 var i = 0 ;
365365 var total = toDelete .length + toDownload .length ;
366366 var self = this ;
367- var lastDraw = Sys .time ();
368- function pumpEvents ()
369- {
370- #if !flash
371- try
372- {
373- update (Sys .time () - lastDraw );
374- draw ();
375- }
376- catch (_ : Dynamic ) {}
377- #end
378- }
367+ // Remove manual update/draw pumping. Flixel handles UI updates automatically.
368+ // If you need to keep UI responsive, break up work into async callbacks and avoid blocking loops.
379369 function next ()
380370 {
381- // Periodically pump events to keep UI responsive
382- if (Sys .time () - lastDraw > 0.2 )
383- {
384- pumpEvents ();
385- lastDraw = Sys .time ();
386- }
387- if (i < toDelete .length )
388- {
389- var file = toDelete [i ++ ];
390- append (' Deleting ' + file + ' ...' );
391- try
392- {
393- if (sys. FileSystem .exists (file ))
394- {
395- if (sys. FileSystem .isDirectory (file ))
396- sys. FileSystem .deleteDirectory (file );
397- else
398- sys. FileSystem .deleteFile (file );
399- append (' Deleted ' + file );
400- }
401- }
402- catch (e : Dynamic )
403- {
404- append (' [ERROR] Failed to delete ' + file + ' : ' + Std .string (e ));
405- }
406- next ();
407- return ;
408- }
409- if (i - toDelete .length < toDownload .length )
410- {
411- var idx = i - toDelete .length ;
412- var url = toDownload [idx ];
413- var dest = getLocalPathForDownload (url );
414- append (' Downloading ' + url + ' ...' );
415- downloadFile (url , dest , function ()
416- {
417- append (' Downloaded ' + dest );
418- // Unzip ANY zip file after download, write .version, then delete zip
419- if (dest .toLowerCase ().endsWith (' .zip' ))
420- {
421- append (' Unpacking zip...' );
422- try
423- {
424- var base = null ;
425- var ver = null ;
426- var m = ~/ ^ (. *? )-v(\d + )\. zip$ / i ;
427- var fname = haxe.io. Path .withoutDirectory (haxe.io. Path .normalize (dest ));
428- if (m .match (fname ))
429- {
430- base = m .matched (1 );
431- ver = Std .parseInt (m .matched (2 ));
432- }
433- var outDir = null ;
434- if (url .indexOf (' /games/' ) != - 1 && base != null )
435- {
436- outDir = haxe.io. Path .join ([haxe.io. Path .directory (dest ), base ]);
437- }
438- else if (url .toLowerCase ().indexOf (' theme-v' ) != - 1 )
439- {
440- outDir = haxe.io. Path .directory (dest );
441- }
442- if (outDir != null )
443- {
444- unzipTo (dest , outDir );
445- append (' Unpacked zip.' );
446- // Write .version file
447- if (ver != null )
448- {
449- var versionFile = (url .indexOf (' /games/' ) != - 1 ) ? haxe.io. Path .join ([outDir , " .version" ]) : haxe.io. Path .join ([outDir , " .version" ]);
450- sys.io. File .saveContent (versionFile , Std .string (ver ));
451- }
452- // Delete zip after extraction
453- try
454- sys. FileSystem .deleteFile (dest )
455- catch (_ : Dynamic ) {}
456- }
457- }
458- catch (e : Dynamic )
459- {
460- append (' [ERROR] Failed to unpack zip: ' + Std .string (e ));
461- }
462- }
463- i ++ ;
464- next ();
465- }, function (err : String )
466- {
467- append (' [ERROR] Failed to download ' + url + ' : ' + err );
468- i ++ ;
469- next ();
470- });
471- return ;
472- }
473- append (' Content update complete.' );
474- closeAndContinue ();
371+ // No manual event pumping needed. All work is async and UI remains responsive.
372+ if (i < toDelete .length )
373+ {
374+ var file = toDelete [i ++ ];
375+ append (' [STEP] Deleting ' + file + ' ...' );
376+ try {
377+ if (sys. FileSystem .exists (file )) {
378+ if (sys. FileSystem .isDirectory (file ))
379+ sys. FileSystem .deleteDirectory (file );
380+ else
381+ sys. FileSystem .deleteFile (file );
382+ append (' [STEP] Deleted ' + file );
383+ }
384+ } catch (e : Dynamic ) {
385+ append (' [ERROR] Failed to delete ' + file + ' : ' + Std .string (e ));
386+ }
387+ // Use haxe.Timer.delay to yield to main loop for UI responsiveness
388+ haxe. Timer .delay (next , 10 );
389+ return ;
390+ }
391+ if (i - toDelete .length < toDownload .length )
392+ {
393+ var idx = i - toDelete .length ;
394+ var url = toDownload [idx ];
395+ var dest = getLocalPathForDownload (url );
396+ append (' [STEP] Downloading ' + url + ' ...' );
397+ downloadFile (url , dest , function ()
398+ {
399+ append (' [STEP] Downloaded ' + dest );
400+ // Unzip ANY zip file after download, write .version, then delete zip
401+ if (dest .toLowerCase ().endsWith (' .zip' ))
402+ {
403+ append (' [STEP] Unpacking zip...' );
404+ try {
405+ var base = null ;
406+ var ver = null ;
407+ var m = ~/ ^ (. *? )-v(\d + )\. zip$ / i ;
408+ var fname = haxe.io. Path .withoutDirectory (haxe.io. Path .normalize (dest ));
409+ if (m .match (fname )) {
410+ base = m .matched (1 );
411+ ver = Std .parseInt (m .matched (2 ));
412+ }
413+ var outDir = null ;
414+ if (url .indexOf (' /games/' ) != - 1 && base != null )
415+ outDir = haxe.io. Path .join ([haxe.io. Path .directory (dest ), base ]);
416+ else if (url .toLowerCase ().indexOf (' theme-v' ) != - 1 )
417+ outDir = haxe.io. Path .directory (dest );
418+ if (outDir != null ) {
419+ unzipTo (dest , outDir );
420+ append (' [STEP] Unpacked zip.' );
421+ // Write .version file
422+ if (ver != null ) {
423+ var versionFile = haxe.io. Path .join ([outDir , " .version" ]);
424+ sys.io. File .saveContent (versionFile , Std .string (ver ));
425+ }
426+ // Delete zip after extraction
427+ try sys. FileSystem .deleteFile (dest ) catch (_ : Dynamic ) {}
428+ }
429+ } catch (e : Dynamic ) {
430+ append (' [ERROR] Failed to unpack zip: ' + Std .string (e ));
431+ }
432+ }
433+ i ++ ;
434+ // Use haxe.Timer.delay to yield to main loop for UI responsiveness
435+ haxe. Timer .delay (next , 10 );
436+ }, function (err : String )
437+ {
438+ append (' [ERROR] Failed to download ' + url + ' : ' + err );
439+ i ++ ;
440+ haxe. Timer .delay (next , 10 );
441+ });
442+ return ;
443+ }
444+ append (' [STEP] Content update complete.' );
445+ closeAndContinue ();
475446 }
476- next ();
447+ next (); // All work is async, UI will remain responsive
477448 #else
478449 append (' Content update not supported on this platform.' );
479450 closeAndContinue ();
0 commit comments