z_mirror/StatsGui
git clone https://git.raiguard.me/z_mirror/StatsGui
1c9f69e
trunk
1local flib_format =require ( "__flib__.format" ) 2 3local constants =require ( "constants" ) 4 5-- Code based on "improved research queue" by sonaxaton 6-- https://github.com/dbeckwith/factorio-research-queue/blob/af6404ab696502a86eec40a4baf7fe00d0c714c7/control.lua#L316 7return function () 8local strings ={} 9 10for _ , force in pairs ( game . forces ) do 11local tech =force . current_research 12if tech then 13-- Retrieve or create progress samples table 14local progress_samples =storage . research_progress_samples [ force . index ] 15if not progress_samples then 16progress_samples ={} 17storage . research_progress_samples [ force . index ] =progress_samples 18end 19progress_samples [ # progress_samples + 1 ] ={ tech =tech . name , progress =force . research_progress } 20if # progress_samples > constants . research_progress_samples_count then 21table . remove ( progress_samples , 1 ) 22end 23 24local estimated_ticks =0 25local num_samples =0 26if # progress_samples > 1 then 27for i =2 , # progress_samples do 28local previous_sample =progress_samples [ i - 1 ] 29local current_sample =progress_samples [ i ] 30if previous_sample . tech == current_sample . tech then 31-- How much the progress increased per tick 32local speed =( current_sample . progress - previous_sample . progress ) / 60 33-- Don't add if the speed is negative for whatever reason 34if speed > 0 then 35-- How many ticks left until the research is finished 36estimated_ticks =estimated_ticks + (( 1 - current_sample . progress ) / speed ) 37num_samples =num_samples + 1 38end 39end 40end 41-- Rolling average 42if num_samples > 0 then 43estimated_ticks =estimated_ticks / num_samples 44end 45end 46 47if num_samples > 0 then 48strings [ force . index ] =flib_format . time ( estimated_ticks ) 49else 50strings [ force . index ] ="∞" 51end 52end 53end 54 55storage . research_progress_strings =strings 56end