Up-in-the-Air – commitdiff

You can use Git to clone the repository via the web URL. Download snapshot (zip)
Game respects speed and collection radius settings
authorJulian Fietkau <git@fietkau.software>
Tue, 24 Sep 2024 13:48:09 +0000 (15:48 +0200)
committerJulian Fietkau <git@fietkau.software>
Tue, 24 Sep 2024 13:48:09 +0000 (15:48 +0200)
main.js

diff --git a/main.js b/main.js
index b2ce2a3451382f4ab81807bb7ca0bcca1a6f5df5..de926dba98c265bfc40b14cffebc649ba76119fa 100644 (file)
--- a/main.js
+++ b/main.js
@@ -258,7 +258,7 @@ function init(game, canvas) {
 
   game.view.camera.position.set(-5, -game.courseRadius, game.view.camera.position.z);
   game.view.scene = scene;
-  
+
   reset(game);
 
   function pinwheelPositionUpdate(game, viewportX, viewportY) {
@@ -396,7 +396,7 @@ function animate(game, renderer, scene) {
   if(game.ui.currentPage == 'pause') {
     return;
   }
-  let delta = Math.min(game.view.clock.getDeltaTime(), 1 / 12);
+  let delta = Math.min(game.view.clock.getDeltaTime(), 1 / 12) * (game.settings['difficulty']['speed'] / 100);
   game.timeProgress = (game.timeProgress + delta);
 
   game.objects.pinwheel.rotation.z -= 5 * delta;
@@ -485,6 +485,14 @@ function animate(game, renderer, scene) {
     game.ui.moveToPage('endingcutscene', true);
   }
 
+  if(game.settings.audio.music > 0.0 && game.view.music && !game.view.music.isPlaying) {
+    const remainingRealTime = (game.timeTotal - game.timeProgress) / (game.settings['difficulty']['speed'] / 100);
+    if(remainingRealTime >= game.assets.audio.music.duration - 2) {
+      game.view.music.offset = 0;
+      game.view.music.play();
+    }
+  }
+
   const angle = 2 * Math.PI * (game.timeProgress / game.timeTotal);
   game.view.camera.position.x = game.courseRadius * Math.sin(angle);
   game.view.camera.position.y = - game.courseRadius * Math.cos(angle);
@@ -526,9 +534,8 @@ function animate(game, renderer, scene) {
   if(game.objects.feather.speed.y > -1) {
     applyForceToFeather(game, tiltedGravity);
   }
-  game.objects.feather.speed.multiplyScalar(1 - delta);
-  game.objects.feather.rotation.z = -0.1 * game.objects.feather.speed.x;
-  game.objects.feather.position.addScaledVector(game.objects.feather.speed, delta);
+  game.objects.feather.rotation.z = -0.1 * game.objects.feather.speed.x * game.settings['difficulty']['speed'] / 100;
+  game.objects.feather.position.addScaledVector(game.objects.feather.speed, delta * game.settings['difficulty']['speed'] / 100);
 
   if(pinwheelForce > 0.2) {
     if(game.objects.feather.twistSpeed < 0.0001) {
@@ -546,15 +553,16 @@ function animate(game, renderer, scene) {
     }
   }
 
-  game.objects.feather.twistSpeed = Math.min(0.13, game.objects.feather.twistSpeed);
+  game.objects.feather.twistSpeed = Math.min(0.13, game.objects.feather.twistSpeed) * game.settings['difficulty']['speed'] / 100;
   game.objects.feather.rotation.x = (game.objects.feather.rotation.x + game.objects.feather.twistSpeed) % (2 * Math.PI);
 
-  let collectedScale = lerp(0.6, 0.3, 1 - Math.pow(1 - game.objects.words.collectedCount / game.objects.words.length, 2));
+  const collectedScale = lerp(0.6, 0.3, 1 - Math.pow(1 - game.objects.words.collectedCount / game.objects.words.length, 2));
+  const collectingRadius = - 0.5 + 1.5 * game.settings['difficulty']['collectingradius'];
   for(let i = 0; i < game.objects.words.length; i++) {
     let word = game.objects.words[i];
     if(!word.collected &&
        game.objects.feather.speed.length() < 10.0 &&
-       new THREE.Vector3().subVectors(word.mapPos, game.objects.feather.position).length() < 1) {
+       new THREE.Vector3().subVectors(word.mapPos, game.objects.feather.position).length() < collectingRadius) {
       word.collected = game.view.clock.getElapsedTime();
       game.objects.words.collectedCount += 1;
     }
@@ -751,8 +759,8 @@ game.ui.root.querySelectorAll('button.goto').forEach((btn) => {
     game.ui.moveToPage(Array.from(target.classList).filter(c => c != 'goto')[0]);
   });
 });
-game.ui.root.querySelectorAll('.options .controls input, .options .graphics input, .options .feather input, .options .accessibility input').forEach((radioOrCb) => {
-  radioOrCb.addEventListener('change', () => applySettings(game));
+game.ui.root.querySelectorAll('.options .controls input, .options .graphics input, .options .feather input, .options .accessibility input, .options .accessibility select').forEach((elem) => {
+  elem.addEventListener('change', () => applySettings(game));
 });
 game.ui.root.querySelectorAll('.ui-page .audio input[type=range]').forEach((elem) => {
   elem.addEventListener('input', (e) => {
@@ -786,6 +794,7 @@ game.ui.root.querySelectorAll('.options .controls input').forEach((radio) => {
 game.ui.root.querySelectorAll('.options input[name=upInTheAirGame-font]').forEach((radio) => {
   radio.addEventListener('change', () => applySettings(game));
 });
+game.ui.root.querySelector('.options .keyboard button[value="reset"]').addEventListener('click', applySettings(game));
 game.ui.root.querySelectorAll('.ui-page .areatabs button').forEach((btn) => {
   btn.addEventListener('click', (e) => {
     btn.parentNode.querySelectorAll('button').forEach((otherBtn) => {
@@ -836,7 +845,7 @@ game.ui.moveToPage = (target, skipFade = false) => {
   if(target == 'pause') {
     game.view.music.stop();
   } else if(game.ui.currentPage == 'pause' && target == 'gameplay') {
-    game.view.music.offset = game.timeProgress;
+    game.view.music.offset = (game.timeProgress / (game.settings['difficulty']['speed'] / 100)) % game.assets.audio.music.duration;
     game.view.music.play();
   }
   game.ui.currentPage = target;