From facfa26ef2e8656a11ecf7412cd2cef60581a55f Mon Sep 17 00:00:00 2001
From: yuni <hut@hut.pm>
Date: Sat, 30 Nov 2024 05:20:21 +0100
Subject: [PATCH] add option to fast travel *into* jupiter

---
 src/chat.rs          | 59 ++++++++++++++++++++++++++++++++++++++++++++
 src/chats/phone.yaml | 56 +++++++++++++++++++++++++++++++++++++++--
 src/data/defs.txt    |  2 +-
 3 files changed, 114 insertions(+), 3 deletions(-)

diff --git a/src/chat.rs b/src/chat.rs
index 3796541..f805776 100644
--- a/src/chat.rs
+++ b/src/chat.rs
@@ -1026,6 +1026,65 @@ pub fn handle_chat_scripts(
                     });
                 }
             }
+            "jupiterdive" => {
+                let dest = vars.get("$$dive_destination");
+                let speed_kmh = vars.getf("$$dive_speed");
+                let angle = vars.getf("$$dive_angle");
+
+                if let (Some(dest), Some(speed_kmh), Some(angle)) = (dest, speed_kmh, angle) {
+                    let distance = if angle < 10.0 {
+                        if speed_kmh >= 1e7 {
+                            1e8
+                        } else if speed_kmh >= 1e6 {
+                            1e7
+                        } else {
+                            1e6
+                        }
+                    } else {
+                        1e6
+                    };
+                    let jupiter_pos = id2pos
+                        .0
+                        .get(cmd::ID_JUPITER)
+                        .unwrap_or_else(|| &DVec3::ZERO);
+                    let latitude: f64 = match dest.as_str() {
+                        "aurora" => 70.0,
+                        "equator" => -4.0,
+                        "redspot" => -25.0,
+                        _ => {
+                            error!("Unknown destination for jupiterdive chat script: '{dest}'");
+                            0.0
+                        }
+                    };
+                    let offset = DQuat::from_rotation_z(latitude.to_radians())
+                        * DVec3::new(nature::JUPITER_RADIUS + distance, 0.0, 0.0);
+                    //let offset = DQuat::from_rotation_z(angle.to_radians()) * DVec3::new(distance, 0.0, 0.0);
+                    let target_pos = *jupiter_pos + offset;
+
+                    let v_horizontal = DVec3::X * speed_kmh / 3.6; // km/h -> m/s
+                    let v_requested_steepness =
+                        DQuat::from_rotation_y((180.0 - angle).to_radians()) * v_horizontal;
+                    let v_target =
+                        DQuat::from_rotation_z(latitude.to_radians()) * v_requested_steepness;
+                    let towards_jupiter =
+                        look_at_quat(target_pos, *jupiter_pos, Dir3::X.as_dvec3());
+                    if let Ok((mut pos, mut rot, mut v)) = q_playercam.get_single_mut() {
+                        v.0 = v_target;
+                        pos.0 = target_pos;
+                        rot.0 = towards_jupiter;
+                    }
+
+                    suit.oxygen = suit.oxygen_max;
+                    gforce.ignore_gforce_seconds = 1.0;
+                    ew_sfx.send(audio::PlaySfxEvent(audio::Sfx::WakeUp));
+                    ew_effect.send(visual::SpawnEffectEvent {
+                        class: visual::Effects::FadeIn(css::AQUA.into()),
+                        duration: 1.0,
+                    });
+                } else {
+                    error!("Chat script 'jupiterdive' needs the '$$dive_*' variables to be set.");
+                }
+            }
             "cryofadeout" => {
                 ew_effect.send(visual::SpawnEffectEvent {
                     class: visual::Effects::FadeOut(css::AQUA.into()),
diff --git a/src/chats/phone.yaml b/src/chats/phone.yaml
index 2c94114..de8a617 100644
--- a/src/chats/phone.yaml
+++ b/src/chats/phone.yaml
@@ -63,15 +63,67 @@
     - Metis Prime is an abandoned asteroid mining area with dangerous radiation.
     - Farview is a tourist lookout spot with no current human population.
     - goto: travel_node_stationselect
+- Can you shoot me into Jupiter?:
+  - But of course! For such an unhinged request, please submit to a breath analyzer check to confirm that you are sober.
+  - "[Accept breath analyzer request]":
+    - Test passed. Where exactly would you like to go?
+    - To the aurora!:
+      - set: $$dive_destination aurora
+      - goto: travel_dive
+    - Equator, please!:
+      - set: $$dive_destination equator
+      - goto: travel_dive
+    - The great red spot!:
+      - set: $$dive_destination redspot
+      - goto: travel_dive
+    - I changed my mind.:
+      - Very reasonable of you. Anything else I can help you with?
+  - I changed my mind.:
+    - Very reasonable of you. Anything else I can help you with?
 - Where can I find you?:
   - We advertise our stations with a large green cross.
   - Just look around, chances are that you are near one.
   - If not, simply request a pick-up and we will find you.
-  - goto: travel_mainnode
 - I just wanted to say that you're awesome!:
   - Thank you so much!
   - Hearing this makes my day!
   - Satisfying our customers is what I'm programmed to live for.
-  - goto: travel_mainnode
 - "[Hang up]":
   - goto: EXIT
+- goto: travel_mainnode
+
+- label: travel_dive
+- What speed?
+- Just drop me off in the atmosphere.:
+  - set: $$dive_speed 0
+  - set: $$dive_angle 0
+  - goto: travel_dive_confirm
+- "10,000km/h":
+  - set: $$dive_speed 10000
+- "100,000km/h":
+  - set: $$dive_speed 100000
+- "1,000,000km/h":
+  - set: $$dive_speed 1000000
+- "10,000,000km/h":
+  - set: $$dive_speed 10000000
+- "[Hang up]":
+  - goto: EXIT
+
+- What angle?
+- Straight in, zero degrees:
+  - set: $$dive_angle 0
+- Steep, 30 degrees:
+  - set: $$dive_angle 30
+- Flat, 60 degrees:
+  - set: $$dive_angle 60
+- Horizontal, 90 degrees:
+  - set: $$dive_angle 90
+- "[Hang up]":
+  - goto: EXIT
+
+- label: travel_dive_confirm
+- Parameters confirmed. Are you ready?
+- Let's do this!:
+  - script: jupiterdive
+- "[Hang up]": []
+- goto: EXIT
diff --git a/src/data/defs.txt b/src/data/defs.txt
index 4baaf3f..7d2b2db 100644
--- a/src/data/defs.txt
+++ b/src/data/defs.txt
@@ -95,7 +95,7 @@ actor 0 0 0
         atmosphere jupiter
         physics off
         rotationy 3.13
-        rotationz 135
+        rotationz 55
         angularmomentum 30 30 30
         actor 0 0 0 orbitring
             scale 778.479e9