22// WEB WORKER (engine.js)
33// =================================================================
44// This script runs in the background and handles all game logic calculations.
5-
6-
75function loop ( ) {
86 if ( timerId !== null ) {
97 clearTimeout ( timerId ) ;
@@ -14,14 +12,23 @@ function loop() {
1412
1513 const tickInterval = 1000 / data . gameSettings . ticksPerSecond ;
1614 let elapsed = now - lastTickTime ;
17- let ticksToProcess = Math . floor ( elapsed / tickInterval ) ;
15+ let ticksAvailable = Math . floor ( elapsed / tickInterval ) ;
1816 let didSomething = false ;
1917
20- if ( ticksToProcess > 0 ) {
21- lastTickTime += ticksToProcess * tickInterval ;
18+ const maxTicksPerLoop = 10 ;
19+ let ticksProcessed = ticksAvailable ;
20+
21+ if ( ticksAvailable > maxTicksPerLoop ) {
22+ ticksProcessed = maxTicksPerLoop ;
23+ const extraTicks = ticksAvailable - maxTicksPerLoop ;
24+ data . currentGameState . bonusTime += extraTicks * tickInterval ;
25+ }
26+
27+ if ( ticksProcessed > 0 ) {
28+ lastTickTime += ticksProcessed * tickInterval ;
2229
2330 const effectiveSpeed = data . gameSettings . gameSpeed * data . gameSettings . bonusSpeed ;
24- const totalTicksToRun = ticksToProcess * effectiveSpeed ;
31+ const totalTicksToRun = ticksProcessed * effectiveSpeed ;
2532
2633 if ( ! data . gameSettings . stop ) {
2734 for ( let i = 0 ; i < totalTicksToRun ; i ++ ) {
@@ -33,24 +40,22 @@ function loop() {
3340 }
3441 }
3542 if ( data . gameSettings . bonusSpeed > 1 ) {
36- const processedElapsed = ticksToProcess * tickInterval ;
43+ const processedElapsed = ticksProcessed * tickInterval ;
3744 const bonusTimeConsumed = processedElapsed * data . gameSettings . gameSpeed * ( data . gameSettings . bonusSpeed - 1 ) ;
38-
3945 data . currentGameState . bonusTime -= bonusTimeConsumed ;
4046 }
4147 } else {
42- data . currentGameState . bonusTime += tickInterval * ticksToProcess ;
48+ data . currentGameState . bonusTime += tickInterval * ticksProcessed ;
4349 }
4450
45- postMessage ( {
46- type : 'update' ,
47- } ) ;
51+ postMessage ( { type : 'update' } ) ;
4852 }
4953
5054 timerId = setTimeout ( loop , 1000 / data . gameSettings . ticksPerSecond ) ;
5155}
5256
5357
58+
5459// Listen for updates from the worker
5560onmessage = function ( e ) {
5661 const { type } = e . data ;
0 commit comments