Compare commits
No commits in common. "b3ec9edb18f22a4e749b3ecfcfd080480d57ca0b" and "877e664df9ebfd28e3295dbf94b1512b2b39020f" have entirely different histories.
b3ec9edb18
...
877e664df9
14
CHANGELOG.md
14
CHANGELOG.md
|
@ -1,15 +1,5 @@
|
|||
# git development version
|
||||
# Git Development Version
|
||||
|
||||
- Upgrade to Rust 1.80
|
||||
|
||||
# v0.10.1
|
||||
|
||||
- Add character "Luna" near starting area
|
||||
- Performance improvements
|
||||
|
||||
# v0.10.0
|
||||
|
||||
- Upgrade to Bevy 0.14, Rust 1.79
|
||||
- Implement gravity and orbiting (everything's super fast now)
|
||||
- Implement radio stations
|
||||
- Implement loading whole scenes from blender files
|
||||
|
@ -20,8 +10,8 @@
|
|||
- Add suffocation sound effects
|
||||
- Add new character "Sus" near the pizzeria
|
||||
- More conversations
|
||||
- Fix flashlight when inside vehicles
|
||||
- Regression: Broken generic asteroids -> disabled for now
|
||||
- Regression: Broken collision on light orbs, supply crates
|
||||
|
||||
# v0.9.2
|
||||
|
||||
|
|
1151
Cargo.lock
generated
1151
Cargo.lock
generated
File diff suppressed because it is too large
Load diff
23
Cargo.toml
23
Cargo.toml
|
@ -10,14 +10,14 @@
|
|||
|
||||
[package]
|
||||
name = "outfly"
|
||||
version = "0.10.1"
|
||||
version = "0.9.2"
|
||||
edition = "2021"
|
||||
homepage = "https://codeberg.org/outfly/outfly"
|
||||
repository = "https://codeberg.org/outfly/outfly"
|
||||
categories = ["game", "aerospace", "simulation"]
|
||||
keywords = ["game", "space", "3d"]
|
||||
license = "GPL-3.0-only"
|
||||
rust-version = "1.80.0"
|
||||
rust-version = "1.76.0"
|
||||
|
||||
[dependencies]
|
||||
# For parsing the game definition file, src/data/defs.txt
|
||||
|
@ -36,18 +36,27 @@ toml_edit = { version = "0.22", features = ["serde"] }
|
|||
|
||||
[dependencies.bevy]
|
||||
# The bevy game engine, the basis for this game
|
||||
version = "0.14"
|
||||
# We temporarily use a fork with a custom bug fix, see https://codeberg.org/outfly/bevy
|
||||
version = "0.13.2"
|
||||
git = "https://codeberg.org/outfly/bevy.git"
|
||||
rev = "e4dc13639106aa86826f6243d58f3209e1e94b1b"
|
||||
default-features = false
|
||||
features = ["animation", "bevy_asset", "bevy_audio", "bevy_scene", "bevy_winit", "bevy_core_pipeline", "bevy_pbr", "bevy_gltf", "bevy_render", "bevy_text", "bevy_ui", "jpeg", "multi_threaded", "png", "tonemapping_luts", "vorbis"]
|
||||
features = ["animation", "bevy_asset", "bevy_audio", "bevy_scene", "bevy_winit", "bevy_core_pipeline", "bevy_pbr", "bevy_gltf", "bevy_render", "bevy_text", "bevy_ui", "jpeg", "multi-threaded", "png", "tonemapping_luts", "vorbis"]
|
||||
|
||||
[dependencies.bevy_embedded_assets]
|
||||
# For embedding assets into the binary, creating a self-sufficient executable
|
||||
version = "0.11"
|
||||
# We temporarily use a fork with a custom bug fix, see https://codeberg.org/outfly/bevy
|
||||
version = "0.10.2"
|
||||
git = "https://codeberg.org/outfly/bevy_embedded_assets.git"
|
||||
rev = "2696fcc0319e8660c50d4601e7d4e530cf0bb981"
|
||||
optional = true
|
||||
|
||||
[dependencies.bevy_xpbd_3d]
|
||||
# For physics and collision handling
|
||||
version = "0.5"
|
||||
# We temporarily use a fork with a custom bug fix, see https://codeberg.org/outfly/bevy
|
||||
version = "0.4.2"
|
||||
git = "https://codeberg.org/outfly/bevy_xpbd.git"
|
||||
rev = "b6a03d6ec41e409d56f6b876f654a14d0b33afa7"
|
||||
default-features = false
|
||||
features = ["3d", "f64", "parry-f64", "parallel", "async-collider"]
|
||||
|
||||
|
@ -61,7 +70,7 @@ blend = "0.8.0"
|
|||
[features]
|
||||
default = ["x11", "embed_assets"]
|
||||
dev_mode = []
|
||||
dev = ["dev_mode", "bevy/file_watcher"] #, "bevy/dynamic_linking"
|
||||
dev = ["dev_mode", "bevy/dynamic_linking", "bevy/file_watcher"]
|
||||
release_linux = ["x11", "wayland", "embed_assets"]
|
||||
release_windows = ["embed_assets"]
|
||||
wasm = ["bevy/webgl2"]
|
||||
|
|
|
@ -35,7 +35,7 @@ The `SPACE` key helps you move more intuitively by slowing you down. Hold it fo
|
|||
|
||||
When you're ready, take a look around, explore the starting area. There is a friendly person floating nearby in a red space suit that would love to talk to you.
|
||||
|
||||
The game is dark. After all, space is dark. The planets and moons orbit in real time, the map changes depending on when you play, and if you're unlucky, you start in the shadow of Jupiter and everything's even darker! Try the flashlight (`f` key), turning off shadows in the menu, and make sure that Augmented Reality is on (`TAB` key) which gives you a little extra light amplification.
|
||||
The game is dark. After all, space is dark. The planets and moons orbit in real time, the map changes depending on when you play, and if you're unlucky, the sun may be eclipsed and everything's even darker! Try the flashlight (`f` key), turning off shadows in the menu, and make sure that Augmented Reality is on (`TAB` key) which gives you a little extra light amplification.
|
||||
|
||||
Press `Esc` for the menu to restart the game if you get lost, explore more key bindings, game features, and the **achievements** to get some guidance on what you can do in the game.
|
||||
|
||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
3
build.rs
3
build.rs
|
@ -21,11 +21,8 @@ fn main() -> std::io::Result<()> {
|
|||
|
||||
let file = File::create("src/data/scenes.in");
|
||||
if let Ok(mut file) = file {
|
||||
write!(&file, "// THIS FILE IS AUTOGENERATED BY build.rs BASED ON DATA IN src/blender/scene_*.blend FILES!\n")?;
|
||||
write!(&file, "// DO NOT MODIFY MANUALLY, CHANGES WILL BE OVERWRITTEN!\n")?;
|
||||
write!(&file, "[\n")?;
|
||||
extract_scene(&mut file, "test", "src/blender/scene_test.blend")?;
|
||||
extract_scene(&mut file, "workshop", "src/blender/scene_workshop.blend")?;
|
||||
write!(&file, "]\n")?;
|
||||
}
|
||||
Ok(())
|
||||
|
|
1
build/nix/README.md
Normal file
1
build/nix/README.md
Normal file
|
@ -0,0 +1 @@
|
|||
This is a work-in-progress nix package. It successfully worked on one NixOS system, but failed on another due to obscure errors. It also failed using "nix build" on ArchLinux.
|
|
@ -1,69 +0,0 @@
|
|||
{ lib
|
||||
, self ? null
|
||||
, buildType ? "release"
|
||||
, platform ? "linux"
|
||||
, enableWayland ? true
|
||||
, enableXorg ? true
|
||||
, enableOpenGL ? true
|
||||
, enableVulkan ? true
|
||||
, rustPlatform
|
||||
, makeDesktopItem
|
||||
, pkg-config
|
||||
, libxkbcommon
|
||||
, alsa-lib
|
||||
, libGL
|
||||
, vulkan-loader
|
||||
, wayland
|
||||
, libXrandr
|
||||
, libXcursor
|
||||
, libX11
|
||||
, libXi
|
||||
, ...
|
||||
}:
|
||||
|
||||
assert (platform == "linux" ) -> (enableWayland || enableXorg);
|
||||
assert (platform == "linux" ) -> (enableVulkan || enableOpenGL);
|
||||
|
||||
rustPlatform.buildRustPackage rec {
|
||||
name = "outfly";
|
||||
inherit buildType;
|
||||
src = ./../..;
|
||||
version = if (self ? rev) then self.rev else "dirty";
|
||||
|
||||
buildNoDefaultFeatures = true;
|
||||
buildFeatures = [ "embed_assets" ] ++ lib.optionals enableXorg [ "x11" ]
|
||||
++ lib.optionals enableWayland [ "wayland" ];
|
||||
|
||||
runtimeInputs = [ libxkbcommon ]
|
||||
++ lib.optionals enableOpenGL [ libGL ]
|
||||
++ lib.optionals enableXorg [ libXrandr libX11 ]
|
||||
++ lib.optionals enableVulkan [ vulkan-loader ];
|
||||
|
||||
buildInputs = [ alsa-lib.dev libXcursor libXi ]
|
||||
++ lib.optionals enableWayland [ wayland ];
|
||||
|
||||
nativeBuildInputs = [ pkg-config ];
|
||||
doCheck = false;
|
||||
|
||||
postFixup = ''
|
||||
patchelf $out/bin/outfly \
|
||||
--add-rpath ${lib.makeLibraryPath runtimeInputs}
|
||||
'';
|
||||
|
||||
postPatch = ''
|
||||
find ../cargo-vendor-dir -name Cargo.toml -exec sed -i 's/^workspace = true//' {} +
|
||||
'';
|
||||
|
||||
cargoLock = { lockFile = ./../../Cargo.lock; };
|
||||
|
||||
desktopItems = [
|
||||
(makeDesktopItem {
|
||||
name = "outfly";
|
||||
exec = "outfly";
|
||||
|
||||
desktopName = "OutFly";
|
||||
categories = [ "Game" ];
|
||||
})
|
||||
];
|
||||
}
|
||||
|
|
@ -1 +1,47 @@
|
|||
with import <nixpkgs> { }; callPackage ./build.nix { }
|
||||
{
|
||||
rustPlatform,
|
||||
pkg-config,
|
||||
alsa-lib,
|
||||
libcap,
|
||||
libxkbcommon,
|
||||
wayland,
|
||||
udev,
|
||||
vulkan-loader,
|
||||
xorg,
|
||||
lib,
|
||||
}:
|
||||
rustPlatform.buildRustPackage rec {
|
||||
src = ../../..;
|
||||
pname = "outfly";
|
||||
version = "0.8.1";
|
||||
cargoLock = {
|
||||
lockFile = "${src}/Cargo.lock";
|
||||
};
|
||||
nativeBuildInputs = [ pkg-config ];
|
||||
|
||||
buildNoDefaultFeatures = true;
|
||||
buildFeatures = [
|
||||
"release_linux"
|
||||
];
|
||||
buildInputs = [
|
||||
alsa-lib
|
||||
libcap
|
||||
wayland
|
||||
];
|
||||
postFixup =
|
||||
let
|
||||
runtimeDeps = [
|
||||
vulkan-loader
|
||||
libxkbcommon
|
||||
xorg.libX11
|
||||
xorg.libXrandr
|
||||
xorg.libXi
|
||||
xorg.libXcursor
|
||||
];
|
||||
libPath = lib.makeLibraryPath runtimeDeps;
|
||||
in
|
||||
''
|
||||
patchelf $out/bin/outfly \
|
||||
--add-rpath ${libPath}
|
||||
'';
|
||||
}
|
||||
|
|
|
@ -1,34 +1,16 @@
|
|||
{
|
||||
"nodes": {
|
||||
"flake-utils": {
|
||||
"inputs": {
|
||||
"systems": "systems"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1710146030,
|
||||
"narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=",
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1722185531,
|
||||
"narHash": "sha256-veKR07psFoJjINLC8RK4DiLniGGMgF3QMlS4tb74S6k=",
|
||||
"owner": "NixOS",
|
||||
"lastModified": 1714076141,
|
||||
"narHash": "sha256-Drmja/f5MRHZCskS6mvzFqxEaZMeciScCTFxWVLqWEY=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "52ec9ac3b12395ad677e8b62106f0b98c1f8569d",
|
||||
"rev": "7bb2ccd8cdc44c91edba16c48d2c8f331fb3d856",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"owner": "nixos",
|
||||
"ref": "nixos-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
|
@ -36,24 +18,8 @@
|
|||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"flake-utils": "flake-utils",
|
||||
"nixpkgs": "nixpkgs"
|
||||
}
|
||||
},
|
||||
"systems": {
|
||||
"locked": {
|
||||
"lastModified": 1681028828,
|
||||
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"type": "github"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
|
|
|
@ -1,48 +1,17 @@
|
|||
{
|
||||
description = "A breathtaking 3D space game in the rings of Jupiter";
|
||||
|
||||
inputs = {
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||||
flake-utils.url = "github:numtide/flake-utils";
|
||||
nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
|
||||
};
|
||||
outputs = { self, nixpkgs, flake-utils }:
|
||||
flake-utils.lib.eachDefaultSystem (system:
|
||||
let
|
||||
overlays = [ ];
|
||||
pkgs = import nixpkgs { inherit system overlays; };
|
||||
in {
|
||||
packages.outfly = pkgs.callPackage ./build.nix {};
|
||||
packages.default = self.packages.${system}.outfly;
|
||||
|
||||
apps.outfly = {
|
||||
type = "app";
|
||||
program = "${self.packages.${system}.outfly}/bin/outfly";
|
||||
};
|
||||
apps.default = self.apps.${system}.outfly;
|
||||
outputs = { self, nixpkgs }: {
|
||||
|
||||
devShells.default = let
|
||||
buildInputs = [
|
||||
pkgs.alsa-lib.dev
|
||||
packages.x86_64-linux.outfly = let
|
||||
pkgs = import nixpkgs { system = "x86_64-linux"; };
|
||||
in pkgs.callPackage ./default.nix {};
|
||||
|
||||
#opengl
|
||||
pkgs.libGL
|
||||
packages.x86_64-linux.default = self.packages.x86_64-linux.outfly;
|
||||
|
||||
pkgs.libxkbcommon
|
||||
|
||||
pkgs.xorg.libXcursor
|
||||
pkgs.xorg.libXi
|
||||
pkgs.xorg.libXrandr
|
||||
pkgs.xorg.libX11
|
||||
|
||||
pkgs.vulkan-loader
|
||||
];
|
||||
nativeBuildInputs = [
|
||||
pkgs.cargo
|
||||
pkgs.pkg-config
|
||||
|
||||
];
|
||||
|
||||
in pkgs.mkShell {
|
||||
inherit buildInputs nativeBuildInputs;
|
||||
LD_LIBRARY_PATH = "${pkgs.lib.makeLibraryPath buildInputs}";
|
||||
};
|
||||
});
|
||||
};
|
||||
}
|
||||
|
|
|
@ -236,12 +236,10 @@ apart from the other characters. Let's outline the personalities/backstories:
|
|||
- Totally a furry
|
||||
- Has big plans for this area, but not enough time to implement everything
|
||||
- Nerd about high energy communications technology
|
||||
6. Luna @ workshop:
|
||||
6. ??? @ workshop:
|
||||
- Mechanic
|
||||
- Operates a workshop to craft and mod space vehicles
|
||||
- Nerd about space suits and vehicles
|
||||
- Just wants to get away from it all
|
||||
- Attempts to reach the end of space and time through special relativity
|
||||
7. Ash @ hideout:
|
||||
- Monk master of a cult of Buddhist origins
|
||||
- Uptight, self-disciplined, driven, wise
|
||||
|
|
14
src/actor.rs
14
src/actor.rs
|
@ -428,10 +428,11 @@ pub fn handle_input(
|
|||
|
||||
pub fn handle_vehicle_enter_exit(
|
||||
mut commands: Commands,
|
||||
mut settings: ResMut<Settings>,
|
||||
mut er_vehicle: EventReader<VehicleEnterExitEvent>,
|
||||
mut ew_achievement: EventWriter<game::AchievementEvent>,
|
||||
mut q_playerflashlight: Query<
|
||||
&mut Transform,
|
||||
&mut Visibility,
|
||||
(
|
||||
With<PlayersFlashLight>,
|
||||
Without<ActorVehicleBeingEntered>,
|
||||
|
@ -476,9 +477,9 @@ pub fn handle_vehicle_enter_exit(
|
|||
commands.entity(vehicle).remove::<hud::IsTargeted>();
|
||||
commands.entity(vehicle).insert(PlayerCamera);
|
||||
commands.entity(vehicle).insert(PlayerDrivesThis);
|
||||
if let Ok(mut flashlight_trans) = q_playerflashlight.get_single_mut() {
|
||||
flashlight_trans.rotation = Quat::from_rotation_y(0f32);
|
||||
flashlight_trans.translation = Vec3::new(0.0, 0.0, 0.0);
|
||||
if let Ok(mut flashlight_vis) = q_playerflashlight.get_single_mut() {
|
||||
*flashlight_vis = Visibility::Hidden;
|
||||
settings.flashlight_active = false;
|
||||
}
|
||||
if let Some(vehicle_name) = &event.name {
|
||||
ew_achievement.send(game::AchievementEvent::RideVehicle(
|
||||
|
@ -490,11 +491,6 @@ pub fn handle_vehicle_enter_exit(
|
|||
if let Some(collider) = &vehicle_component.stored_drivers_collider {
|
||||
commands.entity(driver).insert(collider.clone());
|
||||
}
|
||||
if let Ok(mut flashlight_trans) = q_playerflashlight.get_single_mut() {
|
||||
flashlight_trans.rotation =
|
||||
Quat::from_rotation_y(180f32.to_radians());
|
||||
flashlight_trans.translation = Vec3::new(0.0, 0.0, 1.0);
|
||||
}
|
||||
commands.entity(driver).insert(RigidBody::Dynamic);
|
||||
ew_sfx.send(audio::PlaySfxEvent(audio::Sfx::Switch));
|
||||
commands.entity(vehicle).remove::<PlayerCamera>();
|
||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -25,7 +25,6 @@ use bevy_xpbd_3d::prelude::*;
|
|||
use std::collections::HashMap;
|
||||
|
||||
pub const INITIAL_ZOOM_LEVEL: f64 = 10.0;
|
||||
pub const MAX_DIST_FOR_MATCH_VELOCITY: f64 = 10000.0;
|
||||
|
||||
pub struct CameraPlugin;
|
||||
|
||||
|
@ -34,10 +33,7 @@ impl Plugin for CameraPlugin {
|
|||
app.add_systems(Startup, setup_camera);
|
||||
app.add_systems(Update, handle_input.run_if(in_control));
|
||||
app.add_systems(Update, update_map_only_object_visibility.run_if(alive));
|
||||
app.add_systems(
|
||||
PostUpdate,
|
||||
manage_player_actor.in_set(sync::SyncSet::PositionToTransform),
|
||||
);
|
||||
app.add_systems(Update, manage_player_actor.after(handle_input));
|
||||
app.add_systems(
|
||||
PostUpdate,
|
||||
sync_camera_to_player
|
||||
|
@ -426,15 +422,6 @@ pub fn apply_input_to_player(
|
|||
key_input: Res<ButtonInput<KeyCode>>,
|
||||
q_audiosinks: Query<(&audio::Sfx, &AudioSink)>,
|
||||
q_target: Query<&LinearVelocity, (With<hud::IsTargeted>, Without<actor::PlayerCamera>)>,
|
||||
q_closest: Query<
|
||||
(&Position, &LinearVelocity),
|
||||
(
|
||||
Without<hud::IsTargeted>,
|
||||
Without<actor::PlayerCamera>,
|
||||
Without<actor::Player>,
|
||||
Without<actor::PlayerDrivesThis>,
|
||||
),
|
||||
>,
|
||||
mut q_playercam: Query<
|
||||
(
|
||||
Entity,
|
||||
|
@ -472,21 +459,8 @@ pub fn apply_input_to_player(
|
|||
let target_v: DVec3 = if let Ok(target) = q_target.get_single() {
|
||||
target.0
|
||||
} else {
|
||||
let mut closest_distance = MAX_DIST_FOR_MATCH_VELOCITY;
|
||||
let mut closest_velocity = None;
|
||||
for (testpos, v) in q_closest.iter() {
|
||||
let distance = (pos.0 - testpos.0).length();
|
||||
if distance < closest_distance {
|
||||
closest_velocity = Some(v);
|
||||
closest_distance = distance;
|
||||
}
|
||||
}
|
||||
if closest_velocity.is_some() {
|
||||
closest_velocity.unwrap().0
|
||||
} else {
|
||||
let relative_pos = pos.0 - jupiter_pos.0;
|
||||
nature::orbital_velocity(relative_pos, nature::JUPITER_MASS)
|
||||
}
|
||||
let relative_pos = pos.0 - jupiter_pos.0;
|
||||
nature::orbital_velocity(relative_pos, nature::JUPITER_MASS)
|
||||
};
|
||||
// Handle key input
|
||||
if focused {
|
||||
|
|
26
src/chat.rs
26
src/chat.rs
|
@ -12,7 +12,6 @@
|
|||
// and manages the flow of conversations.
|
||||
|
||||
use crate::prelude::*;
|
||||
use bevy::color::palettes::css;
|
||||
use bevy::prelude::*;
|
||||
use bevy_xpbd_3d::prelude::*;
|
||||
use serde::Deserialize;
|
||||
|
@ -795,7 +794,7 @@ pub fn handle_chat_events(
|
|||
|
||||
fn handle_reply_keys(
|
||||
keyboard_input: Res<ButtonInput<KeyCode>>,
|
||||
settings: Res<var::Settings>,
|
||||
settings: ResMut<var::Settings>,
|
||||
q_choices: Query<&Choice>,
|
||||
mut q_chats: Query<&mut Chat>,
|
||||
mut evwriter_sfx: EventWriter<audio::PlaySfxEvent>,
|
||||
|
@ -927,14 +926,14 @@ pub fn handle_chat_scripts(
|
|||
}
|
||||
ew_sfx.send(audio::PlaySfxEvent(audio::Sfx::WakeUp));
|
||||
ew_effect.send(visual::SpawnEffectEvent {
|
||||
class: visual::Effects::FadeIn(css::AQUA.into()),
|
||||
class: visual::Effects::FadeIn(Color::CYAN),
|
||||
duration: 1.0,
|
||||
});
|
||||
}
|
||||
}
|
||||
"cryofadeout" => {
|
||||
ew_effect.send(visual::SpawnEffectEvent {
|
||||
class: visual::Effects::FadeOut(css::AQUA.into()),
|
||||
class: visual::Effects::FadeOut(Color::CYAN),
|
||||
duration: 5.1,
|
||||
});
|
||||
}
|
||||
|
@ -950,7 +949,6 @@ pub fn handle_chat_scripts(
|
|||
|
||||
pub fn update_chat_variables(
|
||||
mut vars: ResMut<var::GameVars>,
|
||||
settings: Res<var::Settings>,
|
||||
q_player: Query<&actor::Suit, With<actor::Player>>,
|
||||
) {
|
||||
if let Ok(suit) = q_player.get_single() {
|
||||
|
@ -959,23 +957,5 @@ pub fn update_chat_variables(
|
|||
"player_oxygen_seconds",
|
||||
(suit.oxygen / nature::OXY_S).to_string(),
|
||||
);
|
||||
vars.set_in_scope(
|
||||
"$",
|
||||
"player_suit_health_percent",
|
||||
((suit.integrity * 100.0).round() as u8).to_string(),
|
||||
);
|
||||
let wears_chefhat = if let Some(ava) = hud::PLAYER_AR_AVATARS.get(settings.ar_avatar) {
|
||||
match ava.0 {
|
||||
hud::Avatar::ChefHat => 1,
|
||||
_ => 0,
|
||||
}
|
||||
} else {
|
||||
0
|
||||
};
|
||||
vars.set_in_scope(
|
||||
"$",
|
||||
"chefhat",
|
||||
wears_chefhat.to_string(),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
- Oh hey, you're awake!
|
||||
- set: $met
|
||||
- I found you drifting out cold, and thought, I better watch over you.
|
||||
- Took us here behind that moonlet, to shield you from the micrometeorites.
|
||||
- Took us here behind that moonlet, to shield you from the micros.
|
||||
- if: "$$player_oxygen_seconds <= 0"
|
||||
HELP! I'M SUFFOCATING:
|
||||
- goto: suffocating
|
||||
|
@ -25,19 +25,15 @@
|
|||
- No worries. Folks are stretched thin around this corner, we gotta watch out for each other.
|
||||
- How are you feeling?
|
||||
- goto: howru
|
||||
- I don't want to talk to you.:
|
||||
- Huh? Then why did you chat me up?
|
||||
- But ok, see you around.
|
||||
- goto: EXIT
|
||||
- I didn't ask you to help me!:
|
||||
- I didn't ask for this.:
|
||||
- label: didntask
|
||||
- "Sure, 'cause you were unconscious. I just did what felt right. Is there a problem?"
|
||||
- Nevermind. Thank you.:
|
||||
- goto: thx
|
||||
- Leave me alone!:
|
||||
- goto: EXIT
|
||||
- Micrometeorites?:
|
||||
- Those tiny 混蛋 that fly right through you, leaving holes in your suit. And your body.
|
||||
- Micros? What's that?:
|
||||
- Micrometeorites. Those tiny 混蛋 that fly right through you, leaving holes in your suit. And your body.
|
||||
- Ouch! Thank you so much.:
|
||||
- goto: thx
|
||||
- Whatever... I didn't ask for this.:
|
||||
|
@ -107,9 +103,9 @@
|
|||
- That massive sphere over there, that's Jupiter.
|
||||
- We're about 150,000km away from its surface, on the very outside of it's rings.
|
||||
- This area is called the Thebe gossamer ring.
|
||||
- The moon Thebe is actually pretty close right now, flinging all those micrometeorites at us.
|
||||
- Micrometeorites?:
|
||||
- Those tiny 混蛋 that fly right through you, leaving holes in your suit. And your body.
|
||||
- The moon Thebe is actually pretty close right now, flinging all those micros at us.
|
||||
- Micros? What's that?:
|
||||
- Micrometeorites. Those tiny 混蛋 that fly right through you, leaving holes in your suit. And your body.
|
||||
- goto: help
|
||||
- Why am I here?:
|
||||
- That's a very philosophical question.
|
||||
|
@ -201,7 +197,9 @@
|
|||
- goto: reservation
|
||||
- My head hurts, my suit is leaking, I think I'm dying...:
|
||||
- 他妈的, that sound terrible.
|
||||
- Would you like me to patch up your suit up?
|
||||
- Unlikely that you'll die though.
|
||||
- You're wearing a SecondSkyn™. It's the best, it'll take care of you.
|
||||
- Would you like me to patch it up?
|
||||
- label: patchup
|
||||
- Yes please!:
|
||||
- Here you go!
|
||||
|
@ -340,242 +338,6 @@
|
|||
- goto: eat
|
||||
- goto: reservation
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
- chat: Luna
|
||||
- "if $$player_suit_health_percent < 100":
|
||||
- Holy shit!
|
||||
- Look at all those scratches and tears on your suit!
|
||||
- script: repairsuit
|
||||
- set: grateful
|
||||
- Let me fix that!
|
||||
- And I topped off your oxygen tank while I'm at it.
|
||||
- script: refilloxygen 1
|
||||
- goto: mainnode
|
||||
- Oh hey you! Have an oxygen refill!
|
||||
- script: refilloxygen 1
|
||||
- set: grateful
|
||||
|
||||
- label: mainnode
|
||||
- if: "$grateful"
|
||||
Thank you so much!:
|
||||
- No problem at all!
|
||||
- set: grateful 0
|
||||
- goto: mainnode
|
||||
- if: "$$chefhat"
|
||||
The cake is a lie.:
|
||||
- if $explained:
|
||||
- ...
|
||||
- Yes, indeed.
|
||||
- I memorized this phrase to tell anyone who claims to be able to travel back in time.
|
||||
- If they can tell me one of those phrases *before* I tell them, it must mean that they traveled back in time! How else could they know the phrase?
|
||||
- But... You're telling me the phrase *after* I told you.
|
||||
- So you are proving nothing.
|
||||
- Go kill yourself, magically rewind time, and *then* tell me the phrase with the chef hat on.
|
||||
- goto: mainnode
|
||||
- if ~$explained:
|
||||
- Ooooh.
|
||||
- Now why would you say that?
|
||||
- I... don't really know.:
|
||||
- You seem confused.
|
||||
- It's ok. Just drift a bit, take some deep breaths, and come back when you are feeling better.
|
||||
- goto: EXIT
|
||||
- I was promised a cake. There was no cake.:
|
||||
- How utterly disturbing.
|
||||
- The real question is, why would I not say that?:
|
||||
- Point taken.
|
||||
- That's a great sentence to just randomly say.
|
||||
- Congratulations on your creativity.
|
||||
- Funny hat too.
|
||||
- I'm just following orders.:
|
||||
- YOU'RE AN ACTUAL FUCKING TIME TRAVELER?!
|
||||
- set: believe
|
||||
- Please, tell me everything you can about this!
|
||||
- goto: node_ask
|
||||
- Because cake is delicious!:
|
||||
- That makes no sense whatsoever.
|
||||
- Stop wasting my time, lunatic.
|
||||
- goto: EXIT
|
||||
- goto: mainnode
|
||||
- What are you up to?:
|
||||
- I'm running a workshop. Come by if you need any repairs!
|
||||
- Tinkering on various projects.
|
||||
- What kind of projects?:
|
||||
- A tuned MotorAce spaceship, an impact dampener, and... a secret project.
|
||||
- label: projects
|
||||
- Tell me about the spaceship:
|
||||
- Ohh this one is mind-bending.
|
||||
- By redirecting the energy flux of the oversized reaction wheels into the ion engine capacitors, you can boost the thrust of this beast to flesh-ripping levels.
|
||||
- It's not... really... safe for humans.
|
||||
- But if you do want to give it a try, the ship is over there.
|
||||
- IT IS PROVIDED TO YOU WITHOUT WARRANTY OF ANY KIND.
|
||||
- IN NO EVENT WILL I BE LIABLE TO YOU FOR DAMAGES.
|
||||
- goto: projects
|
||||
- Tell me about the impact dampener:
|
||||
- Well. This spaceship is not really safe for humans.
|
||||
- So I'm working on a suit mod to dampen the effect of g-forces.
|
||||
- Not much to show for now, maybe come back in a couple weeks!
|
||||
- goto: projects
|
||||
- Tell me about the secret project:
|
||||
- You wish!
|
||||
- goto: projects
|
||||
- What keeps you going in your pursuits?:
|
||||
- if ~$whatsyourmotivation:
|
||||
- set: whatsyourmotivation
|
||||
- This... uhm, is the first time anybody has ever asked me that.
|
||||
- Well, it sounds a bit crazy.
|
||||
- I'm trying to reach the end.
|
||||
- The end of what?: []
|
||||
- You're nuts.:
|
||||
- A lunatic, you could say.
|
||||
- goto: mainnode
|
||||
- The end of everything. Of life, of stars, of protons themselves.
|
||||
- You know how when you're close to the speed of light, time slows down?
|
||||
- nowait: true
|
||||
Yes.:
|
||||
- goto: skiprelativityintro
|
||||
- You age slower, can fly further, time dilation from special relativity.
|
||||
- label: skiprelativityintro
|
||||
- Given the right speed, you age so slowly that you can literally go anywhere you want.
|
||||
- Any *time* you want.
|
||||
- set: timetravel
|
||||
- Time travel! Only into the future though, of course.:
|
||||
- Exactly.
|
||||
- goto: continuemonologue
|
||||
- Can I go back into the past?:
|
||||
- Nooo, that doesn't quite work.
|
||||
- Well, maybe with exotic matter with negative mass, using a theoretical Alcubierre drive.
|
||||
- If you ever stumble on particles with negative mass, *PLEASE* let me know right away!
|
||||
- But no.
|
||||
- goto: continuemonologue
|
||||
- You're nuts, time travel doesn't exist.:
|
||||
- Uh huh.
|
||||
- Hey, I gotta do some stuff, see you around.
|
||||
- goto: EXIT
|
||||
- In the future only, of course.
|
||||
- label: continuemonologue
|
||||
- I want to get all the way out to the edge of the visible universe, to the end of time, and watch the world evaporate into nothingness.
|
||||
- Got the popcorn waiting already.
|
||||
- This is the ultimate engineering challenge, but I'm convinced that it is possible, and I just *have* to do this.
|
||||
- And when I work on it, the whole universe turns silent.
|
||||
- There is just me, my tools, and the metal.
|
||||
- It's bliss.
|
||||
- Fascinating.:
|
||||
- Thanks for listening. I appreciate it.
|
||||
- Usually nobody cares.
|
||||
- goto: projects
|
||||
- Wow, you're edgy.:
|
||||
- And you're a rounding error.
|
||||
- You'll be dead in a blink of the eye of the universe, when my journey will just begin.
|
||||
- goto: EXIT
|
||||
- Yeah, sorry for the monologue. Anything else?
|
||||
- goto: projects
|
||||
- Good luck with that!:
|
||||
- Thanks!
|
||||
- goto: mainnode
|
||||
- goto: timeout
|
||||
- Good luck with that!:
|
||||
- Thanks!
|
||||
- goto: mainnode
|
||||
- goto: timeout
|
||||
- What brings you here?:
|
||||
- if $thinking:
|
||||
- As said, I don't like people.
|
||||
- if ~$thinking:
|
||||
- Well, uh...
|
||||
- set: thinking
|
||||
- How should I put this? Don't take it personally, but...
|
||||
- I really don't like people.
|
||||
- I'm happy to help you, don't get me wrong.
|
||||
- But... not really because I care about you.
|
||||
- I enjoy the challenge of fixing, mending, creating.
|
||||
- Humans in general, though, ravage and exploit.
|
||||
- It's in their nature, and I can't stand it.
|
||||
- I just want to get away. From all this insanity, triviality,...
|
||||
- Just want to pursue my projects without anyone standing in my way.
|
||||
- goto: mainnode
|
||||
- if: "$timetravel"
|
||||
Do you think time travel into the past is possible?:
|
||||
- if $believe:
|
||||
- Well, you just proved it to me, didn't you?
|
||||
- How else would you know the phrase and the chef hat thing?
|
||||
- I still can't believe it.
|
||||
- Sad that we don't know *how* or *why* this is happening.
|
||||
- This will give me a lot to think about. Thank you!
|
||||
- goto: mainnode
|
||||
- if ~$believe:
|
||||
- No.
|
||||
- Well, theoretically, there's all sorts of way to do this but none of them are feasible.
|
||||
- Why do you ask?
|
||||
- Just curious:
|
||||
- It's good to stay curious.
|
||||
- goto: mainnode
|
||||
- If I die, I seem to wake up in the same spot over and over again...:
|
||||
- Hey, let me be very clear here.
|
||||
- Do not waste my time with bullshit, or I will scrap your body for raw materials.
|
||||
- I'm serious. Everything reverts back to how it was before, and nobody remembers me.:
|
||||
- Hm.
|
||||
- Fascinating.
|
||||
- I don't believe you.
|
||||
- But there is obviously one way we can easily validate this.
|
||||
- set: $explained
|
||||
- Kill yourself to rewind time. Then come back to me wearing a silly chef hat and say "The cake is a lie."
|
||||
- label: timetravelqanda
|
||||
- Why? I don't get it.:
|
||||
- You know, I think a lot about time travel.
|
||||
- I memorized some phrases that I would tell anyone who claims to be able to travel back in time.
|
||||
- If they can tell me one of those phrases *before* I tell them, it must mean that they traveled back in time! How else could they know the phrase?
|
||||
- goto: timetravelqanda
|
||||
- Where can I get a chef hat?:
|
||||
- Not a real one, of course.
|
||||
- Change the settings of your space suit to project an avatar in augmented reality.
|
||||
- You should find a "Chef Hat" option somewhere. [Press ESC]
|
||||
- goto: timetravelqanda
|
||||
- That's genius.:
|
||||
- Thank you!
|
||||
- Now go kill yourself. Don't forget the chef hat.
|
||||
- goto: EXIT
|
||||
- I'm not going to kill myself.:
|
||||
- Well, doesn't really matter how you die.
|
||||
- "Just remember. Wear silly chef hat, and tell me: The cake is a lie."
|
||||
- goto: EXIT
|
||||
- Whatever.:
|
||||
- Thank you.
|
||||
- goto: mainnode
|
||||
- Bye!:
|
||||
- So long, drifter!
|
||||
- goto: EXIT
|
||||
- label: timeout
|
||||
- Hm? Is your transmitter borked?
|
||||
- goto: EXIT
|
||||
|
||||
- label: node_ask
|
||||
- When I die, I just wake up and everything is back as it was before.:
|
||||
- What? Just like that? This is so wild.
|
||||
- label: node_ask2
|
||||
- We have talked before. You told me to die, come back to you with a chef hat, and say that sentence.:
|
||||
- Hah, so the plan worked out! YES!
|
||||
- Let me apologize though. I must have been rude before you showed me proof for your story.
|
||||
- There are just so many bullshiters in the world and I don't have the patience anymore.
|
||||
- But I believe you now.
|
||||
- If there is *anything* I can do for you, let me know. This is amazing!
|
||||
- goto: mainnode
|
||||
- Leave me alone.:
|
||||
- goto: gtfo
|
||||
- goto: node_ask2
|
||||
- Leave me alone.:
|
||||
- label: gtfo
|
||||
- What? No!
|
||||
- Argh.
|
||||
- You damn teaser.
|
||||
- Fine.
|
||||
- goto: EXIT
|
||||
- Please, I *have* to know.
|
||||
- goto: node_ask
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
|
@ -601,7 +363,7 @@
|
|||
- Where are we?:
|
||||
- Inside Jupiter's rings, obviously.
|
||||
- We're about 150,000km away from the gas giant.
|
||||
- This region is called Serenity by its inhabitants, due to the relative safety from Jupiter's magnetic field and the micrometeorites.
|
||||
- This region is called Serenity by its inhabitants, due to the relative safety from Jupiter's magnetic field and the micros.
|
||||
- goto: generic_questions
|
||||
- I think I'm good for now.: []
|
||||
|
||||
|
|
500
src/cmd.rs
500
src/cmd.rs
|
@ -16,6 +16,7 @@ use bevy::pbr::{NotShadowCaster, NotShadowReceiver};
|
|||
use bevy::prelude::*;
|
||||
use bevy_xpbd_3d::prelude::*;
|
||||
use regex::Regex;
|
||||
use std::time::SystemTime;
|
||||
|
||||
pub const ID_SPECIAL_PLAYERCAM: &str = "PLAYERCAMERA";
|
||||
pub const ID_EARTH: &str = "earth";
|
||||
|
@ -376,17 +377,9 @@ pub fn load_defs(mut ew_spawn: EventWriter<SpawnEvent>) {
|
|||
}
|
||||
}
|
||||
["relativeto", id] => {
|
||||
// Offsets this actor's position by the pos. of the actor with the given id.
|
||||
state.relative_to = Some(id.to_string());
|
||||
}
|
||||
["orbitaround", object_id, radius_str] => {
|
||||
// Places the actor into an orbit around the object_id so that it's position
|
||||
// will be offset by the orbital distance (radius_str) and the phase will
|
||||
// be set dynamically based on the current day+time.
|
||||
// Unlike the "orbit" command, this position is not static, and there is no
|
||||
// parameter for a phase offset, though you can set that with the
|
||||
// "orbit_phase_offset" command.
|
||||
// Make sure to use this with "relativeto" with the object that's being orbited.
|
||||
if let Ok(r) = radius_str.parse::<f64>() {
|
||||
state.orbit_distance = Some(r);
|
||||
state.orbit_object_id = Some(object_id.to_string());
|
||||
|
@ -396,11 +389,6 @@ pub fn load_defs(mut ew_spawn: EventWriter<SpawnEvent>) {
|
|||
}
|
||||
}
|
||||
["orbit", radius_str, phase_str] => {
|
||||
// Offsets the actor's position by the given distance (radius_str)
|
||||
// in the direction as defined by the angle in phase_str.
|
||||
// Unlike "orbitaround", the position is static though and will not
|
||||
// change over time.
|
||||
// Make sure to use this with "relativeto" with the object that's being orbited.
|
||||
if let (Ok(r), Ok(phase)) = (radius_str.parse::<f64>(), phase_str.parse::<f64>()) {
|
||||
state.orbit_distance = Some(r);
|
||||
state.orbit_phase = Some(phase * PI * 2.0);
|
||||
|
@ -410,8 +398,6 @@ pub fn load_defs(mut ew_spawn: EventWriter<SpawnEvent>) {
|
|||
}
|
||||
}
|
||||
["orbit_phase_offset", value] => {
|
||||
// When used in combination with "orbitaround", this command allows
|
||||
// you to move the actor ahead (or behind) in its orbit by the given offset.
|
||||
if let Ok(value_float) = value.parse::<f64>() {
|
||||
let offset_radians = 2.0 * PI * value_float;
|
||||
if let Some(phase_radians) = state.orbit_phase {
|
||||
|
@ -623,8 +609,8 @@ pub fn load_defs(mut ew_spawn: EventWriter<SpawnEvent>) {
|
|||
}
|
||||
["light", color_hex, brightness] => {
|
||||
if let Ok(brightness_float) = brightness.parse::<f32>() {
|
||||
if let Ok(color) = Srgba::hex(color_hex) {
|
||||
state.light_color = Some(Color::Srgba(color));
|
||||
if let Ok(color) = Color::hex(color_hex) {
|
||||
state.light_color = Some(color);
|
||||
state.light_brightness = brightness_float;
|
||||
} else {
|
||||
error!("Can't parse hexadecimal color code: {line}");
|
||||
|
@ -768,39 +754,6 @@ fn spawn_scenes(
|
|||
state.is_point_of_interest = true;
|
||||
ew_spawn.send(SpawnEvent(state));
|
||||
}
|
||||
"shippingcontainer" => {
|
||||
let mut state = ParserState::default();
|
||||
state.class = DefClass::Actor;
|
||||
state.pos = DVec3::new(
|
||||
root_state.pos[0] + pos[0],
|
||||
root_state.pos[1] - pos[2],
|
||||
root_state.pos[2] + pos[1],
|
||||
);
|
||||
state.model = Some("shippingcontainer".to_string());
|
||||
|
||||
state.rotation = Quat::from_euler(EulerRot::XYZ, rot[0], rot[1], rot[2]);
|
||||
|
||||
// command: relativeto ?
|
||||
state.relative_to = root_state.relative_to.clone();
|
||||
|
||||
// command: name Cruiser
|
||||
state.name = Some("Shipping Container".to_string());
|
||||
|
||||
// command: scale 8
|
||||
state.model_scale = 8.0;
|
||||
|
||||
// command: angularmomentum 0 0 0
|
||||
state.angular_momentum = DVec3::ZERO;
|
||||
|
||||
// command: collider handcrafted
|
||||
state.collider_is_one_mesh_of_scene = true;
|
||||
|
||||
// command: density 500
|
||||
state.density = 500.0;
|
||||
|
||||
// command: pointofinterest yes
|
||||
ew_spawn.send(SpawnEvent(state));
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
|
@ -843,19 +796,30 @@ fn spawn_entities(
|
|||
state.pos
|
||||
};
|
||||
if let Some(r) = state.orbit_distance {
|
||||
let mass: Option<f64> = if let Some(id) = &state.orbit_object_id {
|
||||
match id.as_str() {
|
||||
"jupiter" => Some(nature::JUPITER_MASS),
|
||||
"sol" => Some(nature::JUPITER_MASS),
|
||||
let mut phase_radians = 0.0f64;
|
||||
if let Some(phase) = state.orbit_phase {
|
||||
phase_radians += phase;
|
||||
}
|
||||
if let Some(id) = &state.orbit_object_id {
|
||||
let mass = match id.as_str() {
|
||||
"jupiter" => nature::JUPITER_MASS,
|
||||
"sol" => nature::JUPITER_MASS,
|
||||
_ => {
|
||||
error!("Found no mass for object `{id}`");
|
||||
continue;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
None
|
||||
};
|
||||
absolute_pos += nature::pos_offset_for_orbiting_body(r, mass, state.orbit_phase);
|
||||
};
|
||||
let orbital_period = nature::simple_orbital_period(mass, r);
|
||||
phase_radians +=
|
||||
if let Ok(epoch) = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH) {
|
||||
let now = epoch.as_secs_f64() + 614533234154.0; // random
|
||||
PI * 2.0 * (now % orbital_period) / orbital_period
|
||||
} else {
|
||||
error!("Can't determine current time `{id}`");
|
||||
0.0
|
||||
};
|
||||
}
|
||||
absolute_pos += nature::phase_dist_to_coords(-phase_radians, r);
|
||||
}
|
||||
let scale = Vec3::splat(
|
||||
if state.is_sun {
|
||||
|
@ -876,221 +840,223 @@ fn spawn_entities(
|
|||
|
||||
// Spawn the actor
|
||||
let actor_entity;
|
||||
let mut actor = commands.spawn_empty();
|
||||
actor.insert(actor::Actor {
|
||||
id: state.id.clone(),
|
||||
name: state.name.clone(),
|
||||
camdistance: state.camdistance,
|
||||
..default()
|
||||
});
|
||||
actor.insert(SleepingDisabled);
|
||||
if orbits_jupiter {
|
||||
actor.insert(actor::OrbitsJupiter);
|
||||
}
|
||||
actor.insert(world::DespawnOnPlayerDeath);
|
||||
actor.insert(actor::HitPoints::default());
|
||||
actor.insert(Position::from(absolute_pos));
|
||||
if state.is_sphere {
|
||||
let sphere_texture_handle = if let Some(model) = &state.model {
|
||||
Some(asset_server.load(format!("textures/{}.jpg", model)))
|
||||
} else {
|
||||
None
|
||||
};
|
||||
rotation = Quat::from_rotation_x(-90f32.to_radians()) * rotation;
|
||||
let sphere_handle = meshes.add(Sphere::new(1.0).mesh().uv(128, 128));
|
||||
let sphere_material_handle = materials.add(StandardMaterial {
|
||||
base_color_texture: sphere_texture_handle,
|
||||
perceptual_roughness: 1.0,
|
||||
metallic: 0.0,
|
||||
..default()
|
||||
});
|
||||
actor.insert(PbrBundle {
|
||||
mesh: sphere_handle,
|
||||
material: sphere_material_handle,
|
||||
transform: Transform::from_scale(scale),
|
||||
..default()
|
||||
});
|
||||
} else if let Some(model) = &state.model {
|
||||
actor.insert(SpatialBundle {
|
||||
transform: Transform::from_scale(scale),
|
||||
..default()
|
||||
});
|
||||
load_asset(model.as_str(), &mut actor, &*asset_server);
|
||||
}
|
||||
actor.insert(Rotation::from(rotation));
|
||||
|
||||
// Physics Parameters
|
||||
if state.has_physics {
|
||||
actor.insert(RigidBody::Dynamic);
|
||||
actor.insert(LinearVelocity(velocity));
|
||||
actor.insert(AngularVelocity(state.angular_momentum));
|
||||
actor.insert(ColliderDensity(state.density));
|
||||
if state.collider_is_mesh {
|
||||
actor.insert(MassPropertiesBundle::new_computed(
|
||||
&Collider::sphere(0.5 * state.model_scale as f64),
|
||||
state.density,
|
||||
));
|
||||
actor.insert(AsyncSceneCollider::new(Some(
|
||||
ComputedCollider::TriMesh, //ComputedCollider::ConvexDecomposition(VHACDParameters::default())
|
||||
)));
|
||||
} else if state.collider_is_one_mesh_of_scene {
|
||||
actor.insert(MassPropertiesBundle::new_computed(
|
||||
&Collider::sphere(0.5 * state.model_scale as f64),
|
||||
state.density,
|
||||
));
|
||||
actor.insert(
|
||||
AsyncSceneCollider::new(None)
|
||||
.with_shape_for_name("Collider", ComputedCollider::TriMesh)
|
||||
.with_layers_for_name("Collider", CollisionLayers::ALL), //.with_density_for_name("Collider", state.density)
|
||||
);
|
||||
actor.insert(NeedsSceneColliderRemoved);
|
||||
} else {
|
||||
actor.insert(state.collider.clone());
|
||||
}
|
||||
}
|
||||
// TODO: angular velocity for objects without collisions, static objects
|
||||
|
||||
// Optional Components
|
||||
if state.is_player {
|
||||
actor.insert(actor::Player);
|
||||
actor.insert(actor::PlayerCamera);
|
||||
actor.insert(hud::AugmentedRealityOverlayBroadcaster);
|
||||
ew_updateavatar.send(hud::UpdateAvatarEvent);
|
||||
}
|
||||
if state.is_sun {
|
||||
let (r, g, b) = nature::star_color_index_to_rgb(0.656);
|
||||
actor.insert(materials.add(StandardMaterial {
|
||||
base_color: Color::srgb(r * 13.0, g * 13.0, b * 13.0),
|
||||
unlit: true,
|
||||
..default()
|
||||
}));
|
||||
actor.insert((NotShadowCaster, NotShadowReceiver));
|
||||
}
|
||||
if state.is_targeted_on_startup {
|
||||
actor.insert(hud::IsTargeted);
|
||||
}
|
||||
if let Some((mindist, id)) = &state.show_only_in_map_at_distance {
|
||||
actor.insert(camera::ShowOnlyInMap {
|
||||
min_distance: *mindist,
|
||||
distance_to_id: id.clone(),
|
||||
});
|
||||
}
|
||||
if state.is_player || state.is_vehicle {
|
||||
// used to apply mouse movement to actor rotation
|
||||
actor.insert(ExternalTorque::ZERO.with_persistence(false));
|
||||
}
|
||||
if state.is_lifeform {
|
||||
actor.insert(actor::LifeForm::default());
|
||||
actor.insert(actor::ExperiencesGForce::default());
|
||||
actor.insert(actor::Suit {
|
||||
oxygen: state.oxygen,
|
||||
oxygen_max: nature::OXY_D,
|
||||
integrity: state.suit_integrity,
|
||||
..default()
|
||||
});
|
||||
actor.insert(actor::Battery::default());
|
||||
}
|
||||
if state.is_clickable {
|
||||
actor.insert(hud::IsClickable {
|
||||
name: state.name.clone(),
|
||||
pronoun: state.pronoun.clone(),
|
||||
..default()
|
||||
});
|
||||
}
|
||||
if let Some(value) = state.wants_maxrotation {
|
||||
actor.insert(actor::WantsMaxRotation(value));
|
||||
}
|
||||
if let Some(value) = state.wants_maxvelocity {
|
||||
actor.insert(actor::WantsMaxVelocity(value));
|
||||
}
|
||||
if let Some(value) = &state.wants_tolookat_id {
|
||||
actor.insert(actor::WantsToLookAt(value.clone()));
|
||||
}
|
||||
if let Some(value) = &state.wants_matchvelocity_id {
|
||||
actor.insert(actor::WantsMatchVelocityWith(value.clone()));
|
||||
}
|
||||
if let Some(color) = state.light_color {
|
||||
actor.insert((
|
||||
PointLight {
|
||||
intensity: state.light_brightness,
|
||||
color,
|
||||
range: 2000.0,
|
||||
shadows_enabled: settings.shadows_pointlights,
|
||||
..default()
|
||||
},
|
||||
bevy::pbr::CubemapVisibleEntities::default(),
|
||||
bevy::render::primitives::CubemapFrusta::default(),
|
||||
));
|
||||
}
|
||||
if !state.id.is_empty() {
|
||||
actor.insert(actor::Identifier(state.id.clone()));
|
||||
id2pos.0.insert(state.id.clone(), absolute_pos);
|
||||
}
|
||||
if !state.chat.is_empty() {
|
||||
actor.insert(chat::Talker {
|
||||
actor_id: state.id.clone(),
|
||||
chat_name: state.chat.clone(),
|
||||
name: state.name.clone(),
|
||||
pronoun: state.pronoun.clone(),
|
||||
talking_speed: 1.0,
|
||||
});
|
||||
if let Some(name) = &state.name {
|
||||
achievement_tracker.all_people.insert(name.clone());
|
||||
}
|
||||
}
|
||||
if state.is_vehicle {
|
||||
actor.insert(actor::Vehicle::default());
|
||||
if let Some(name) = &state.name {
|
||||
achievement_tracker.all_vehicles.insert(name.clone());
|
||||
}
|
||||
}
|
||||
if state.is_vehicle
|
||||
|| state.is_suited
|
||||
|| state.thrust_forward > 0.0
|
||||
|| state.thrust_sideways > 0.0
|
||||
|| state.thrust_back > 0.0
|
||||
|| state.reaction_wheels > 0.0
|
||||
{
|
||||
actor.insert(actor::Engine {
|
||||
thrust_forward: state.thrust_forward,
|
||||
thrust_back: state.thrust_back,
|
||||
thrust_sideways: state.thrust_sideways,
|
||||
reaction_wheels: state.reaction_wheels,
|
||||
warmup_seconds: state.warmup_seconds,
|
||||
engine_type: state.engine_type,
|
||||
let mut actor = commands.spawn_empty();
|
||||
actor.insert(actor::Actor {
|
||||
id: state.id.clone(),
|
||||
name: state.name.clone(),
|
||||
camdistance: state.camdistance,
|
||||
..default()
|
||||
});
|
||||
}
|
||||
if let Some(_) = state.ar_model {
|
||||
actor.insert(hud::AugmentedRealityOverlayBroadcaster);
|
||||
}
|
||||
if state.is_player {
|
||||
actor.with_children(|builder| {
|
||||
builder.spawn((
|
||||
world::DespawnOnPlayerDeath,
|
||||
actor::PlayersFlashLight,
|
||||
SpotLightBundle {
|
||||
transform: Transform {
|
||||
translation: Vec3::new(0.0, 0.0, 1.0),
|
||||
rotation: Quat::from_rotation_y(180f32.to_radians()),
|
||||
..default()
|
||||
},
|
||||
spot_light: SpotLight {
|
||||
intensity: 400_000_000.0, // lumens
|
||||
color: Color::WHITE,
|
||||
shadows_enabled: true,
|
||||
inner_angle: PI32 / 8.0 * 0.85,
|
||||
outer_angle: PI32 / 4.0,
|
||||
range: 3000.0,
|
||||
..default()
|
||||
},
|
||||
visibility: Visibility::Hidden,
|
||||
actor.insert(SleepingDisabled);
|
||||
if orbits_jupiter {
|
||||
actor.insert(actor::OrbitsJupiter);
|
||||
}
|
||||
actor.insert(world::DespawnOnPlayerDeath);
|
||||
actor.insert(actor::HitPoints::default());
|
||||
actor.insert(Position::from(absolute_pos));
|
||||
if state.is_sphere {
|
||||
let sphere_texture_handle = if let Some(model) = &state.model {
|
||||
Some(asset_server.load(format!("textures/{}.jpg", model)))
|
||||
} else {
|
||||
None
|
||||
};
|
||||
rotation = Quat::from_rotation_x(-90f32.to_radians()) * rotation;
|
||||
let sphere_handle = meshes.add(Sphere::new(1.0).mesh().uv(128, 128));
|
||||
let sphere_material_handle = materials.add(StandardMaterial {
|
||||
base_color_texture: sphere_texture_handle,
|
||||
perceptual_roughness: 1.0,
|
||||
metallic: 0.0,
|
||||
..default()
|
||||
});
|
||||
actor.insert(PbrBundle {
|
||||
mesh: sphere_handle,
|
||||
material: sphere_material_handle,
|
||||
transform: Transform::from_scale(scale),
|
||||
..default()
|
||||
});
|
||||
} else if let Some(model) = &state.model {
|
||||
actor.insert(SpatialBundle {
|
||||
transform: Transform::from_scale(scale),
|
||||
..default()
|
||||
});
|
||||
load_asset(model.as_str(), &mut actor, &*asset_server);
|
||||
}
|
||||
actor.insert(Rotation::from(rotation));
|
||||
|
||||
// Physics Parameters
|
||||
if state.has_physics {
|
||||
actor.insert(RigidBody::Dynamic);
|
||||
actor.insert(LinearVelocity(velocity));
|
||||
actor.insert(AngularVelocity(state.angular_momentum));
|
||||
actor.insert(ColliderDensity(state.density));
|
||||
if state.collider_is_mesh {
|
||||
actor.insert(MassPropertiesBundle::new_computed(
|
||||
&Collider::sphere(0.5 * state.model_scale as f64),
|
||||
state.density,
|
||||
));
|
||||
actor.insert(AsyncSceneCollider::new(Some(
|
||||
ComputedCollider::TriMesh, //ComputedCollider::ConvexDecomposition(VHACDParameters::default())
|
||||
)));
|
||||
} else if state.collider_is_one_mesh_of_scene {
|
||||
actor.insert(MassPropertiesBundle::new_computed(
|
||||
&Collider::sphere(0.5 * state.model_scale as f64),
|
||||
state.density,
|
||||
));
|
||||
actor.insert(
|
||||
AsyncSceneCollider::new(None)
|
||||
.with_shape_for_name("Collider", ComputedCollider::TriMesh)
|
||||
.with_layers_for_name("Collider", CollisionLayers::ALL), //.with_density_for_name("Collider", state.density)
|
||||
);
|
||||
actor.insert(NeedsSceneColliderRemoved);
|
||||
} else {
|
||||
actor.insert(state.collider.clone());
|
||||
}
|
||||
}
|
||||
// TODO: angular velocity for objects without collisions, static objects
|
||||
|
||||
// Optional Components
|
||||
if state.is_player {
|
||||
actor.insert(actor::Player);
|
||||
actor.insert(actor::PlayerCamera);
|
||||
actor.insert(hud::AugmentedRealityOverlayBroadcaster);
|
||||
ew_updateavatar.send(hud::UpdateAvatarEvent);
|
||||
}
|
||||
if state.is_sun {
|
||||
let (r, g, b) = nature::star_color_index_to_rgb(0.656);
|
||||
actor.insert(materials.add(StandardMaterial {
|
||||
base_color: Color::rgb(r, g, b) * 13.0,
|
||||
unlit: true,
|
||||
..default()
|
||||
}));
|
||||
actor.insert((NotShadowCaster, NotShadowReceiver));
|
||||
}
|
||||
if state.is_targeted_on_startup {
|
||||
actor.insert(hud::IsTargeted);
|
||||
}
|
||||
if let Some((mindist, id)) = &state.show_only_in_map_at_distance {
|
||||
actor.insert(camera::ShowOnlyInMap {
|
||||
min_distance: *mindist,
|
||||
distance_to_id: id.clone(),
|
||||
});
|
||||
}
|
||||
if state.is_player || state.is_vehicle {
|
||||
// used to apply mouse movement to actor rotation
|
||||
actor.insert(ExternalTorque::ZERO.with_persistence(false));
|
||||
}
|
||||
if state.is_lifeform {
|
||||
actor.insert(actor::LifeForm::default());
|
||||
actor.insert(actor::ExperiencesGForce::default());
|
||||
actor.insert(actor::Suit {
|
||||
oxygen: state.oxygen,
|
||||
oxygen_max: nature::OXY_D,
|
||||
integrity: state.suit_integrity,
|
||||
..default()
|
||||
});
|
||||
actor.insert(actor::Battery::default());
|
||||
}
|
||||
if state.is_clickable {
|
||||
actor.insert(hud::IsClickable {
|
||||
name: state.name.clone(),
|
||||
pronoun: state.pronoun.clone(),
|
||||
..default()
|
||||
});
|
||||
}
|
||||
if let Some(value) = state.wants_maxrotation {
|
||||
actor.insert(actor::WantsMaxRotation(value));
|
||||
}
|
||||
if let Some(value) = state.wants_maxvelocity {
|
||||
actor.insert(actor::WantsMaxVelocity(value));
|
||||
}
|
||||
if let Some(value) = &state.wants_tolookat_id {
|
||||
actor.insert(actor::WantsToLookAt(value.clone()));
|
||||
}
|
||||
if let Some(value) = &state.wants_matchvelocity_id {
|
||||
actor.insert(actor::WantsMatchVelocityWith(value.clone()));
|
||||
}
|
||||
if let Some(color) = state.light_color {
|
||||
actor.insert((
|
||||
PointLight {
|
||||
intensity: state.light_brightness,
|
||||
color,
|
||||
range: 2000.0,
|
||||
shadows_enabled: settings.shadows_pointlights,
|
||||
..default()
|
||||
},
|
||||
bevy::pbr::CubemapVisibleEntities::default(),
|
||||
bevy::render::primitives::CubemapFrusta::default(),
|
||||
));
|
||||
});
|
||||
}
|
||||
if !state.id.is_empty() {
|
||||
actor.insert(actor::Identifier(state.id.clone()));
|
||||
id2pos.0.insert(state.id.clone(), absolute_pos);
|
||||
}
|
||||
if !state.chat.is_empty() {
|
||||
actor.insert(chat::Talker {
|
||||
actor_id: state.id.clone(),
|
||||
chat_name: state.chat.clone(),
|
||||
name: state.name.clone(),
|
||||
pronoun: state.pronoun.clone(),
|
||||
talking_speed: 1.0,
|
||||
});
|
||||
if let Some(name) = &state.name {
|
||||
achievement_tracker.all_people.insert(name.clone());
|
||||
}
|
||||
}
|
||||
if state.is_vehicle {
|
||||
actor.insert(actor::Vehicle::default());
|
||||
if let Some(name) = &state.name {
|
||||
achievement_tracker.all_vehicles.insert(name.clone());
|
||||
}
|
||||
}
|
||||
if state.is_vehicle
|
||||
|| state.is_suited
|
||||
|| state.thrust_forward > 0.0
|
||||
|| state.thrust_sideways > 0.0
|
||||
|| state.thrust_back > 0.0
|
||||
|| state.reaction_wheels > 0.0
|
||||
{
|
||||
actor.insert(actor::Engine {
|
||||
thrust_forward: state.thrust_forward,
|
||||
thrust_back: state.thrust_back,
|
||||
thrust_sideways: state.thrust_sideways,
|
||||
reaction_wheels: state.reaction_wheels,
|
||||
warmup_seconds: state.warmup_seconds,
|
||||
engine_type: state.engine_type,
|
||||
..default()
|
||||
});
|
||||
}
|
||||
if let Some(_) = state.ar_model {
|
||||
actor.insert(hud::AugmentedRealityOverlayBroadcaster);
|
||||
}
|
||||
if state.is_player {
|
||||
actor.with_children(|builder| {
|
||||
builder.spawn((
|
||||
world::DespawnOnPlayerDeath,
|
||||
actor::PlayersFlashLight,
|
||||
SpotLightBundle {
|
||||
transform: Transform {
|
||||
translation: Vec3::new(0.0, 0.0, 1.0),
|
||||
rotation: Quat::from_rotation_y(180f32.to_radians()),
|
||||
..default()
|
||||
},
|
||||
spot_light: SpotLight {
|
||||
intensity: 40_000_000.0, // lumens
|
||||
color: Color::WHITE,
|
||||
shadows_enabled: true,
|
||||
inner_angle: PI32 / 8.0 * 0.85,
|
||||
outer_angle: PI32 / 4.0,
|
||||
range: 2000.0,
|
||||
..default()
|
||||
},
|
||||
visibility: Visibility::Hidden,
|
||||
..default()
|
||||
},
|
||||
));
|
||||
});
|
||||
}
|
||||
actor_entity = actor.id();
|
||||
}
|
||||
actor_entity = actor.id();
|
||||
|
||||
if let Some(ar_asset_name) = &state.ar_model {
|
||||
let mut entitycmd = commands.spawn((
|
||||
|
|
|
@ -1,10 +1,3 @@
|
|||
A life is like a garden.
|
||||
Perfect moments can be had,
|
||||
but not preserved,
|
||||
except in memory.
|
||||
Live long and prosper.
|
||||
- Leonard Nimoy, 2015
|
||||
|
||||
Though I heard
|
||||
Everyone goes this road
|
||||
Eventually
|
||||
|
|
|
@ -271,45 +271,6 @@ actor 0 59305 0 suitv2
|
|||
scene 10 -30 20 test
|
||||
relativeto player
|
||||
|
||||
actor 700 -100 -1100 suitv2
|
||||
template person
|
||||
relativeto player
|
||||
name Luna
|
||||
id Luna
|
||||
chatid Luna
|
||||
angularmomentum 0 0 0
|
||||
wants maxrotation 0
|
||||
wants maxvelocity none
|
||||
rotationy 108
|
||||
rotationx 180
|
||||
pronoun he
|
||||
scene 22 0 0 workshop
|
||||
relativeto Luna
|
||||
actor -20 10 -23 MeteorAceGT
|
||||
name "MeteorAceGT™"
|
||||
relativeto Luna
|
||||
scale 5
|
||||
vehicle yes
|
||||
collider mesh
|
||||
thrust 50.25 9.84 6.765 10000 5
|
||||
engine ion
|
||||
camdistance 50
|
||||
density 500
|
||||
angularmomentum 0 0 0.2
|
||||
pointofinterest yes
|
||||
actor -9 4 11 lightorb
|
||||
relativeto Luna
|
||||
name "Light Orb"
|
||||
collider mesh
|
||||
scale 0.25
|
||||
light FF8F4A 4000000
|
||||
actor -8 1 -9 lightorb
|
||||
relativeto Luna
|
||||
name "Light Orb"
|
||||
collider mesh
|
||||
scale 0.25
|
||||
light FF8F4A 4000000
|
||||
|
||||
actor -55e3 44e3 0 suitv2
|
||||
template person
|
||||
relativeto thebe
|
||||
|
@ -355,18 +316,15 @@ actor 13200 300 -3000 hollow_asteroid
|
|||
actor 6 11 4 lightorb
|
||||
relativeto cultasteroid
|
||||
name "Light Orb"
|
||||
collider mesh
|
||||
scale 0.25
|
||||
light FF8F4A 2000000
|
||||
actor -6 4 8 lightorb
|
||||
relativeto cultasteroid
|
||||
name "Light Orb"
|
||||
collider mesh
|
||||
scale 0.25
|
||||
light FF8F4A 2000000
|
||||
actor -10 -14 0 crate
|
||||
relativeto cultasteroid
|
||||
collider mesh
|
||||
name "Supply Crate"
|
||||
|
||||
actor -8200 -4400 -8100 asteroid_lum
|
||||
|
@ -381,7 +339,6 @@ actor -8200 -4400 -8100 asteroid_lum
|
|||
actor 70 30 30 lightorb
|
||||
relativeto Lum
|
||||
name "Light Orb"
|
||||
collider mesh
|
||||
scale 3
|
||||
light FF8F4A 500000000
|
||||
|
||||
|
@ -479,13 +436,11 @@ actor -3300 10 0 pizzeria
|
|||
actor -52 -10 0 lightorb
|
||||
name "Light Orb"
|
||||
relativeto pizzeria
|
||||
collider mesh
|
||||
scale 0.25
|
||||
light FF8F4A 5000000
|
||||
actor -50 -3 -2 lightorb
|
||||
name "Light Orb"
|
||||
relativeto pizzeria
|
||||
collider mesh
|
||||
scale 0.25
|
||||
light FF8F4A 5000000
|
||||
actor -33 0 4 clippy
|
||||
|
@ -497,7 +452,6 @@ actor -3300 10 0 pizzeria
|
|||
wants matchvelocitywith pizzeria
|
||||
rotationy -126
|
||||
chatid SubduedClippy
|
||||
collider handcrafted
|
||||
|
||||
actor -45 -4 -4 suitv2
|
||||
template person
|
||||
|
@ -526,25 +480,21 @@ actor 30 -12 -40 suitv2
|
|||
actor 12 -35 -27 lightorb
|
||||
name "Light Orb"
|
||||
relativeto Icarus
|
||||
collider mesh
|
||||
scale 0.25
|
||||
light FF8F4A 5000000
|
||||
actor -2 -11 -9 lightorb
|
||||
name "Light Orb"
|
||||
relativeto Icarus
|
||||
collider mesh
|
||||
scale 0.25
|
||||
light FF8F4A 5000000
|
||||
actor 26 -39 4 lightorb
|
||||
name "Light Orb"
|
||||
relativeto Icarus
|
||||
collider mesh
|
||||
scale 0.25
|
||||
light FF8F4A 5000000
|
||||
actor 1.8 -15.5 16 lightorb
|
||||
name "Light Orb"
|
||||
relativeto Icarus
|
||||
collider mesh
|
||||
scale 0.25
|
||||
light FF8F4A 5000000
|
||||
|
||||
|
@ -569,163 +519,132 @@ actor 100 -18000 2000 clippy
|
|||
wants matchvelocitywith orbbusstopserenity
|
||||
rotationy -90
|
||||
chatid ClippyTransSerenity
|
||||
collider handcrafted
|
||||
|
||||
actor 60 0 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Serenity Station"
|
||||
relativeto busstopclippy
|
||||
id orbbusstopserenity
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 80 0 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Serenity Station"
|
||||
relativeto busstopclippy
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 100 0 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Serenity Station"
|
||||
relativeto busstopclippy
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 120 0 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Serenity Station"
|
||||
relativeto busstopclippy
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 140 0 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Serenity Station"
|
||||
relativeto busstopclippy
|
||||
collider mesh
|
||||
scale 5
|
||||
|
||||
actor -60 0 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Serenity Station"
|
||||
relativeto busstopclippy
|
||||
collider mesh
|
||||
scale 5
|
||||
actor -80 0 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Serenity Station"
|
||||
relativeto busstopclippy
|
||||
collider mesh
|
||||
scale 5
|
||||
actor -100 0 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Serenity Station"
|
||||
relativeto busstopclippy
|
||||
collider mesh
|
||||
scale 5
|
||||
actor -120 0 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Serenity Station"
|
||||
relativeto busstopclippy
|
||||
collider mesh
|
||||
scale 5
|
||||
actor -140 0 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Serenity Station"
|
||||
relativeto busstopclippy
|
||||
collider mesh
|
||||
scale 5
|
||||
|
||||
actor 0 60 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Serenity Station"
|
||||
relativeto busstopclippy
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 0 80 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Serenity Station"
|
||||
relativeto busstopclippy
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 0 100 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Serenity Station"
|
||||
relativeto busstopclippy
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 0 120 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Serenity Station"
|
||||
relativeto busstopclippy
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 0 140 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Serenity Station"
|
||||
relativeto busstopclippy
|
||||
collider mesh
|
||||
scale 5
|
||||
|
||||
actor 0 -60 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Serenity Station"
|
||||
relativeto busstopclippy
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 0 -80 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Serenity Station"
|
||||
relativeto busstopclippy
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 0 -100 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Serenity Station"
|
||||
relativeto busstopclippy
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 0 -120 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Serenity Station"
|
||||
relativeto busstopclippy
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 0 -140 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Serenity Station"
|
||||
relativeto busstopclippy
|
||||
collider mesh
|
||||
scale 5
|
||||
|
||||
actor 0 0 60 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Serenity Station"
|
||||
relativeto busstopclippy
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 0 0 80 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Serenity Station"
|
||||
relativeto busstopclippy
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 0 0 100 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Serenity Station"
|
||||
relativeto busstopclippy
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 0 0 120 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Serenity Station"
|
||||
relativeto busstopclippy
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 0 0 140 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Serenity Station"
|
||||
relativeto busstopclippy
|
||||
collider mesh
|
||||
scale 5
|
||||
|
||||
actor 0 0 -60 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Serenity Station"
|
||||
relativeto busstopclippy
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 0 0 -80 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Serenity Station"
|
||||
relativeto busstopclippy
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 0 0 -100 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Serenity Station"
|
||||
relativeto busstopclippy
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 0 0 -120 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Serenity Station"
|
||||
relativeto busstopclippy
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 0 0 -140 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Serenity Station"
|
||||
relativeto busstopclippy
|
||||
collider mesh
|
||||
scale 5
|
||||
|
||||
actor 8 20 0 suitv2
|
||||
|
@ -746,163 +665,132 @@ actor -184971e3 149410e3 -134273e3 clippy
|
|||
wants matchvelocitywith orbbusstopfarview
|
||||
rotationy -90
|
||||
chatid ClippyTransFarview
|
||||
collider handcrafted
|
||||
|
||||
actor 60 0 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Farview Station"
|
||||
relativeto busstopclippy2
|
||||
id orbbusstopfarview
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 80 0 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Farview Station"
|
||||
relativeto busstopclippy2
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 100 0 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Farview Station"
|
||||
relativeto busstopclippy2
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 120 0 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Farview Station"
|
||||
relativeto busstopclippy2
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 140 0 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Farview Station"
|
||||
relativeto busstopclippy2
|
||||
collider mesh
|
||||
scale 5
|
||||
|
||||
actor -60 0 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Farview Station"
|
||||
relativeto busstopclippy2
|
||||
collider mesh
|
||||
scale 5
|
||||
actor -80 0 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Farview Station"
|
||||
relativeto busstopclippy2
|
||||
collider mesh
|
||||
scale 5
|
||||
actor -100 0 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Farview Station"
|
||||
relativeto busstopclippy2
|
||||
collider mesh
|
||||
scale 5
|
||||
actor -120 0 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Farview Station"
|
||||
relativeto busstopclippy2
|
||||
collider mesh
|
||||
scale 5
|
||||
actor -140 0 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Farview Station"
|
||||
relativeto busstopclippy2
|
||||
collider mesh
|
||||
scale 5
|
||||
|
||||
actor 0 60 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Farview Station"
|
||||
relativeto busstopclippy2
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 0 80 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Farview Station"
|
||||
relativeto busstopclippy2
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 0 100 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Farview Station"
|
||||
relativeto busstopclippy2
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 0 120 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Farview Station"
|
||||
relativeto busstopclippy2
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 0 140 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Farview Station"
|
||||
relativeto busstopclippy2
|
||||
collider mesh
|
||||
scale 5
|
||||
|
||||
actor 0 -60 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Farview Station"
|
||||
relativeto busstopclippy2
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 0 -80 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Farview Station"
|
||||
relativeto busstopclippy2
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 0 -100 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Farview Station"
|
||||
relativeto busstopclippy2
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 0 -120 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Farview Station"
|
||||
relativeto busstopclippy2
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 0 -140 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Farview Station"
|
||||
relativeto busstopclippy2
|
||||
collider mesh
|
||||
scale 5
|
||||
|
||||
actor 0 0 60 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Farview Station"
|
||||
relativeto busstopclippy2
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 0 0 80 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Farview Station"
|
||||
relativeto busstopclippy2
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 0 0 100 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Farview Station"
|
||||
relativeto busstopclippy2
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 0 0 120 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Farview Station"
|
||||
relativeto busstopclippy2
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 0 0 140 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Farview Station"
|
||||
relativeto busstopclippy2
|
||||
collider mesh
|
||||
scale 5
|
||||
|
||||
actor 0 0 -60 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Farview Station"
|
||||
relativeto busstopclippy2
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 0 0 -80 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Farview Station"
|
||||
relativeto busstopclippy2
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 0 0 -100 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Farview Station"
|
||||
relativeto busstopclippy2
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 0 0 -120 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Farview Station"
|
||||
relativeto busstopclippy2
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 0 0 -140 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Farview Station"
|
||||
relativeto busstopclippy2
|
||||
collider mesh
|
||||
scale 5
|
||||
|
||||
|
||||
|
@ -918,163 +806,132 @@ actor 0 -44e3 0 clippy
|
|||
orbit_phase_offset -0.002
|
||||
rotationy -90
|
||||
chatid ClippyTransMetis
|
||||
collider handcrafted
|
||||
|
||||
actor 60 0 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Metis Prime Station"
|
||||
relativeto busstopclippy3
|
||||
id orbbusstopmetis
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 80 0 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Metis Prime Station"
|
||||
relativeto busstopclippy3
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 100 0 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Metis Prime Station"
|
||||
relativeto busstopclippy3
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 120 0 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Metis Prime Station"
|
||||
relativeto busstopclippy3
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 140 0 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Metis Prime Station"
|
||||
relativeto busstopclippy3
|
||||
collider mesh
|
||||
scale 5
|
||||
|
||||
actor -60 0 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Metis Prime Station"
|
||||
relativeto busstopclippy3
|
||||
collider mesh
|
||||
scale 5
|
||||
actor -80 0 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Metis Prime Station"
|
||||
relativeto busstopclippy3
|
||||
collider mesh
|
||||
scale 5
|
||||
actor -100 0 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Metis Prime Station"
|
||||
relativeto busstopclippy3
|
||||
collider mesh
|
||||
scale 5
|
||||
actor -120 0 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Metis Prime Station"
|
||||
relativeto busstopclippy3
|
||||
collider mesh
|
||||
scale 5
|
||||
actor -140 0 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Metis Prime Station"
|
||||
relativeto busstopclippy3
|
||||
collider mesh
|
||||
scale 5
|
||||
|
||||
actor 0 60 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Metis Prime Station"
|
||||
relativeto busstopclippy3
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 0 80 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Metis Prime Station"
|
||||
relativeto busstopclippy3
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 0 100 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Metis Prime Station"
|
||||
relativeto busstopclippy3
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 0 120 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Metis Prime Station"
|
||||
relativeto busstopclippy3
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 0 140 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Metis Prime Station"
|
||||
relativeto busstopclippy3
|
||||
collider mesh
|
||||
scale 5
|
||||
|
||||
actor 0 -60 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Metis Prime Station"
|
||||
relativeto busstopclippy3
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 0 -80 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Metis Prime Station"
|
||||
relativeto busstopclippy3
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 0 -100 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Metis Prime Station"
|
||||
relativeto busstopclippy3
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 0 -120 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Metis Prime Station"
|
||||
relativeto busstopclippy3
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 0 -140 0 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Metis Prime Station"
|
||||
relativeto busstopclippy3
|
||||
collider mesh
|
||||
scale 5
|
||||
|
||||
actor 0 0 60 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Metis Prime Station"
|
||||
relativeto busstopclippy3
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 0 0 80 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Metis Prime Station"
|
||||
relativeto busstopclippy3
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 0 0 100 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Metis Prime Station"
|
||||
relativeto busstopclippy3
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 0 0 120 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Metis Prime Station"
|
||||
relativeto busstopclippy3
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 0 0 140 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Metis Prime Station"
|
||||
relativeto busstopclippy3
|
||||
collider mesh
|
||||
scale 5
|
||||
|
||||
actor 0 0 -60 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Metis Prime Station"
|
||||
relativeto busstopclippy3
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 0 0 -80 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Metis Prime Station"
|
||||
relativeto busstopclippy3
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 0 0 -100 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Metis Prime Station"
|
||||
relativeto busstopclippy3
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 0 0 -120 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Metis Prime Station"
|
||||
relativeto busstopclippy3
|
||||
collider mesh
|
||||
scale 5
|
||||
actor 0 0 -140 "orb_busstop"
|
||||
name "StarTrans Bus Stop: Metis Prime Station"
|
||||
relativeto busstopclippy3
|
||||
collider mesh
|
||||
scale 5
|
||||
|
||||
actor 110 0 2000 whale
|
||||
|
|
|
@ -1,8 +1,6 @@
|
|||
// THIS FILE IS AUTOGENERATED BY build.rs BASED ON DATA IN src/blender/scene_*.blend FILES!
|
||||
// DO NOT MODIFY MANUALLY, CHANGES WILL BE OVERWRITTEN!
|
||||
[
|
||||
("test", "cruiser", [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]),
|
||||
("workshop", "shippingcontainer", [0.0, 0.0, 0.0], [-0.026294278, 0.000376441, 0.014312184]),
|
||||
("workshop", "shippingcontainer", [0.0, 12.0, 0.0], [-0.053937975, -0.013098141, 0.0]),
|
||||
("workshop", "shippingcontainer", [0.0, -12.0, 0.0], [0.061487854, 0.08236491, -0.051188234]),
|
||||
("test", "cruiser", [0.0, 10.971298, 1.222765], [-0.27833763, 0.74558806, 0.31813696]),
|
||||
("test", "cruiser", [-0.46667862, -1.2666901, -7.938822], [1.7932074, 0.10752687, 0.15762906]),
|
||||
("test", "cruiser", [-7.409776, -1.4187636, 11.451159], [-0.27833763, 0.74558806, 0.31813696]),
|
||||
("test", "cruiser", [6.8125467, -11.003204, 0.5323599], [-0.019556522, -1.0606266, -3.0019674]),
|
||||
]
|
||||
|
|
11
src/game.rs
11
src/game.rs
|
@ -11,7 +11,6 @@
|
|||
// This module handles player input, and coordinates interplay between other modules
|
||||
|
||||
use crate::prelude::*;
|
||||
use bevy::color::palettes::css;
|
||||
use bevy::pbr::ExtendedMaterial;
|
||||
use bevy::prelude::*;
|
||||
use bevy::scene::SceneInstance;
|
||||
|
@ -305,21 +304,21 @@ fn handle_player_death(
|
|||
actor::DamageType::Trauma => {
|
||||
settings.death_cause = "Trauma".to_string();
|
||||
ew_effect.send(visual::SpawnEffectEvent {
|
||||
class: visual::Effects::FadeIn(css::MAROON.into()),
|
||||
class: visual::Effects::FadeIn(Color::MAROON),
|
||||
duration: 1.0,
|
||||
});
|
||||
}
|
||||
actor::DamageType::GForce => {
|
||||
settings.death_cause = "Trauma from excessive g forces".to_string();
|
||||
ew_effect.send(visual::SpawnEffectEvent {
|
||||
class: visual::Effects::FadeIn(css::MAROON.into()),
|
||||
class: visual::Effects::FadeIn(Color::MAROON),
|
||||
duration: 1.0,
|
||||
});
|
||||
}
|
||||
_ => {
|
||||
settings.death_cause = "Unknown".to_string();
|
||||
ew_effect.send(visual::SpawnEffectEvent {
|
||||
class: visual::Effects::FadeIn(css::MAROON.into()),
|
||||
class: visual::Effects::FadeIn(Color::MAROON),
|
||||
duration: 1.0,
|
||||
});
|
||||
}
|
||||
|
@ -507,7 +506,9 @@ fn handle_achievement_event(
|
|||
}
|
||||
AchievementEvent::InJupitersShadow => {
|
||||
if !tracker.in_jupiters_shadow {
|
||||
ew_game.send(GameEvent::Achievement("Enter Jupiter's Shadow".into()));
|
||||
ew_game.send(GameEvent::Achievement(
|
||||
"Eclipse the sun with Jupiter".into(),
|
||||
));
|
||||
}
|
||||
tracker.in_jupiters_shadow = true;
|
||||
}
|
||||
|
|
|
@ -970,7 +970,7 @@ fn update_hud(
|
|||
LogLevel::Info => settings.hud_color_console_system,
|
||||
_ => settings.hud_color_console,
|
||||
};
|
||||
chat.sections[row].style.color.set_alpha(opacity);
|
||||
chat.sections[row].style.color.set_a(opacity);
|
||||
row += 1;
|
||||
}
|
||||
|
||||
|
@ -1094,7 +1094,6 @@ fn handle_target_event(
|
|||
play_sfx = true;
|
||||
}
|
||||
if let Some(entity) = target {
|
||||
// TODO: This can panic if the entity despawns in the meantime
|
||||
commands.entity(*entity).insert(IsTargeted);
|
||||
play_sfx = true;
|
||||
|
||||
|
@ -1135,7 +1134,7 @@ fn update_target_selectagon(
|
|||
}
|
||||
selectagon_trans.translation = target_trans.translation;
|
||||
selectagon_trans.scale = target_trans.scale;
|
||||
selectagon_trans.look_at(camera_trans.translation, camera_trans.up());
|
||||
selectagon_trans.look_at(camera_trans.translation, camera_trans.up().into());
|
||||
|
||||
// Enlarge Selectagon to a minimum angular diameter
|
||||
let (angular_diameter, _, _) =
|
||||
|
@ -1222,7 +1221,7 @@ fn update_poi_overlays(
|
|||
if angular_diameter < min_angular_diameter {
|
||||
trans.scale *= min_angular_diameter / angular_diameter;
|
||||
}
|
||||
trans.look_at(camera_trans.translation, camera_trans.up());
|
||||
trans.look_at(camera_trans.translation, camera_trans.up().into());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -44,7 +44,6 @@ pub fn asset_name_to_path(name: &str) -> &'static str {
|
|||
"crate" => "models/crate.glb#Scene0",
|
||||
"MeteorAceGT" => "models/MeteorAceGT.glb#Scene0",
|
||||
"cruiser" => "models/cruiser.glb#Scene0",
|
||||
"shippingcontainer" => "models/shippingcontainer.glb#Scene0",
|
||||
"satellite" => "models/satellite.glb#Scene0",
|
||||
"pizzeria" => "models/pizzeria2.glb#Scene0",
|
||||
"pizzasign" => "models/pizzasign.glb#Scene0",
|
||||
|
@ -122,7 +121,7 @@ impl AsteroidSurface {
|
|||
pub fn material() -> ExtendedMaterial<StandardMaterial, AsteroidSurface> {
|
||||
ExtendedMaterial {
|
||||
base: StandardMaterial {
|
||||
base_color: Color::srgb(0.29, 0.255, 0.208),
|
||||
base_color: Color::rgb(0.29, 0.255, 0.208),
|
||||
perceptual_roughness: 1.0,
|
||||
opaque_render_method: OpaqueRendererMethod::Auto,
|
||||
..default()
|
||||
|
|
|
@ -186,7 +186,7 @@ pub fn setup(
|
|||
MenuElement,
|
||||
NodeBundle {
|
||||
style: style_fullscreen(),
|
||||
background_color: Color::srgba(0.0, 0.0, 0.0, 0.8).into(),
|
||||
background_color: Color::rgba(0.0, 0.0, 0.0, 0.8).into(),
|
||||
visibility: Visibility::Hidden,
|
||||
..default()
|
||||
},
|
||||
|
@ -517,7 +517,7 @@ pub fn handle_input(
|
|||
keyboard_input: Res<ButtonInput<KeyCode>>,
|
||||
mut settings: ResMut<Settings>,
|
||||
mut menustate: ResMut<MenuState>,
|
||||
mut app_exit_events: ResMut<Events<AppExit>>,
|
||||
mut app_exit_events: ResMut<Events<bevy::app::AppExit>>,
|
||||
mut ew_game: EventWriter<game::GameEvent>,
|
||||
mut ew_playerdies: EventWriter<game::PlayerDiesEvent>,
|
||||
mut ew_sfx: EventWriter<audio::PlaySfxEvent>,
|
||||
|
@ -601,7 +601,7 @@ pub fn handle_input(
|
|||
ew_playerdies.send(game::PlayerDiesEvent(actor::DamageType::Depressurization));
|
||||
}
|
||||
MenuAction::Quit => {
|
||||
app_exit_events.send(AppExit::Success);
|
||||
app_exit_events.send(bevy::app::AppExit);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
|
@ -11,7 +11,6 @@
|
|||
// This module manages the messy, impure parts of our universe.
|
||||
|
||||
use crate::prelude::*;
|
||||
use std::time::SystemTime;
|
||||
|
||||
pub const OXYGEN_USE_KG_PER_S: f32 = 1e-5;
|
||||
pub const OXY_S: f32 = OXYGEN_USE_KG_PER_S;
|
||||
|
@ -34,9 +33,6 @@ pub const SOL_MASS: f64 = 1.9885e30;
|
|||
pub const JUPITER_MASS: f64 = 1.8982e27;
|
||||
pub const EARTH_MASS: f64 = 5.972168e24;
|
||||
|
||||
// Arbitrary offset to time epoch, to generate more interesting orbital arrangements:
|
||||
pub const ORBIT_TIME_OFFSET: f64 = 614533234154.0;
|
||||
|
||||
// Each star's values: (x, y, z, magnitude, color index, distance, name)
|
||||
pub const STARS: &[(f32, f32, f32, f32, f32, f32, &str)] = &include!("data/stars.in");
|
||||
|
||||
|
@ -208,25 +204,3 @@ pub fn phase_dist_to_coords(phase_radians: f64, distance: f64) -> DVec3 {
|
|||
distance * phase_radians.sin(),
|
||||
);
|
||||
}
|
||||
|
||||
pub fn pos_offset_for_orbiting_body(
|
||||
orbit_distance: f64,
|
||||
orbited_mass: Option<f64>,
|
||||
phase_offset: Option<f64>,
|
||||
) -> DVec3 {
|
||||
let r = orbit_distance;
|
||||
let mut phase_radians = 0.0f64;
|
||||
if let Some(phase_offset) = phase_offset {
|
||||
phase_radians += phase_offset
|
||||
}
|
||||
if let Some(mass) = orbited_mass {
|
||||
if let Ok(epoch) = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH) {
|
||||
let orbital_period = simple_orbital_period(mass, r);
|
||||
let now = epoch.as_secs_f64() + ORBIT_TIME_OFFSET;
|
||||
phase_radians += PI * 2.0 * (now % orbital_period) / orbital_period;
|
||||
} else {
|
||||
eprintln!("WARNING: Can't determine current time in calculate_position_offset_for_orbiting_body().");
|
||||
}
|
||||
}
|
||||
return phase_dist_to_coords(-phase_radians, r);
|
||||
}
|
||||
|
|
43
src/var.rs
43
src/var.rs
|
@ -204,24 +204,24 @@ impl Default for Settings {
|
|||
font_size_achievement_header: 32.0,
|
||||
font_size_keybindings: 20.0,
|
||||
font_size_version: 20.0,
|
||||
hud_color: Srgba::hex(COLOR_PRIMARY).unwrap().into(),
|
||||
hud_color_fps: Srgba::hex("#181818").unwrap().into(),
|
||||
hud_color_console: Srgba::hex(COLOR_PRIMARY).unwrap().into(),
|
||||
hud_color_console_achievement: Srgba::hex(COLOR_SUCCESS).unwrap().into(),
|
||||
hud_color_console_warn: Srgba::hex(COLOR_WARNING).unwrap().into(),
|
||||
hud_color_console_system: Srgba::hex(COLOR_SECONDARY).unwrap().into(),
|
||||
hud_color_alert: Srgba::hex(COLOR_SECONDARY).unwrap().into(),
|
||||
hud_color_subtitles: Srgba::hex(COLOR_SECONDARY).unwrap().into(),
|
||||
hud_color_choices: Srgba::hex(COLOR_BODY).unwrap().into(),
|
||||
hud_color_speedometer: Srgba::hex(COLOR_PRIMARY).unwrap().into(),
|
||||
hud_color_deathpoem: Srgba::hex("#CC2200").unwrap().into(),
|
||||
hud_color_achievement: Srgba::hex(COLOR_DIM).unwrap().into(),
|
||||
hud_color_achievement_accomplished: Srgba::hex(COLOR_SUCCESS).unwrap().into(),
|
||||
hud_color_achievement_header: Srgba::hex(COLOR_PRIMARY).unwrap().into(),
|
||||
hud_color_death: Srgba::hex(COLOR_SECONDARY).unwrap().into(),
|
||||
hud_color_death_achievements: Srgba::hex(COLOR_SECONDARY).unwrap().into(),
|
||||
hud_color_keybindings: Srgba::hex(COLOR_DIM).unwrap().into(),
|
||||
hud_color_version: Srgba::hex(COLOR_PRIMARY).unwrap().into(),
|
||||
hud_color: Color::hex(COLOR_PRIMARY).unwrap(),
|
||||
hud_color_fps: Color::hex("#181818").unwrap(),
|
||||
hud_color_console: Color::hex(COLOR_PRIMARY).unwrap(),
|
||||
hud_color_console_achievement: Color::hex(COLOR_SUCCESS).unwrap(),
|
||||
hud_color_console_warn: Color::hex(COLOR_WARNING).unwrap(),
|
||||
hud_color_console_system: Color::hex(COLOR_SECONDARY).unwrap(),
|
||||
hud_color_alert: Color::hex(COLOR_SECONDARY).unwrap(),
|
||||
hud_color_subtitles: Color::hex(COLOR_SECONDARY).unwrap(),
|
||||
hud_color_choices: Color::hex(COLOR_BODY).unwrap(),
|
||||
hud_color_speedometer: Color::hex(COLOR_PRIMARY).unwrap(),
|
||||
hud_color_deathpoem: Color::hex("#CC2200").unwrap(),
|
||||
hud_color_achievement: Color::hex(COLOR_DIM).unwrap(),
|
||||
hud_color_achievement_accomplished: Color::hex(COLOR_SUCCESS).unwrap(),
|
||||
hud_color_achievement_header: Color::hex(COLOR_PRIMARY).unwrap(),
|
||||
hud_color_death: Color::hex(COLOR_SECONDARY).unwrap(),
|
||||
hud_color_death_achievements: Color::hex(COLOR_SECONDARY).unwrap(),
|
||||
hud_color_keybindings: Color::hex(COLOR_DIM).unwrap(),
|
||||
hud_color_version: Color::hex(COLOR_PRIMARY).unwrap(),
|
||||
chat_speed: DEFAULT_CHAT_SPEED * if dev_mode { 2.5 } else { 1.0 },
|
||||
ar_avatar: 0,
|
||||
flashlight_active: false,
|
||||
|
@ -405,7 +405,7 @@ impl AchievementTracker {
|
|||
format!("Ride Every Vehicle{ride}\n"),
|
||||
format!("Talk To Everyone{talk}\n"),
|
||||
"Find Earth\n".to_string(),
|
||||
"Enter Jupiter's Shadow\n".to_string(),
|
||||
"Eclipse The Sun With Jupiter\n".to_string(),
|
||||
]
|
||||
}
|
||||
pub fn to_overview(&self) -> Vec<(bool, String)> {
|
||||
|
@ -415,7 +415,10 @@ impl AchievementTracker {
|
|||
(self.ride_every_vehicle, "ride every vehicle".into()),
|
||||
(self.talk_to_everyone, "talk to everyone".into()),
|
||||
(self.find_earth, "find Earth".into()),
|
||||
(self.in_jupiters_shadow, "enter Jupiter's shadow".into()),
|
||||
(
|
||||
self.in_jupiters_shadow,
|
||||
"eclipse the Sun with Jupiter".into(),
|
||||
),
|
||||
]
|
||||
}
|
||||
pub fn to_summary(&self) -> String {
|
||||
|
|
|
@ -12,7 +12,6 @@
|
|||
|
||||
use crate::prelude::*;
|
||||
use bevy::prelude::*;
|
||||
use std::time::Duration;
|
||||
|
||||
pub struct VisualPlugin;
|
||||
|
||||
|
@ -58,36 +57,13 @@ pub struct SpawnEffectEvent {
|
|||
pub duration: f64,
|
||||
}
|
||||
|
||||
#[derive(Resource)]
|
||||
pub struct SuitAnimation {
|
||||
index: AnimationNodeIndex,
|
||||
graph: Handle<AnimationGraph>,
|
||||
}
|
||||
|
||||
pub fn setup(
|
||||
settings: Res<var::Settings>,
|
||||
asset_server: Res<AssetServer>,
|
||||
mut commands: Commands,
|
||||
mut ew_effect: EventWriter<SpawnEffectEvent>,
|
||||
mut graphs: ResMut<Assets<AnimationGraph>>,
|
||||
) {
|
||||
pub fn setup(settings: Res<var::Settings>, mut ew_effect: EventWriter<SpawnEffectEvent>) {
|
||||
if !settings.dev_mode {
|
||||
ew_effect.send(SpawnEffectEvent {
|
||||
class: Effects::FadeIn(Color::BLACK),
|
||||
duration: 4.0,
|
||||
});
|
||||
}
|
||||
|
||||
let mut graph = AnimationGraph::new();
|
||||
let index = graph.add_clip(
|
||||
asset_server.load(GltfAssetLabel::Animation(0).from_asset("models/suit_v2/suit_v2.glb")),
|
||||
1.0,
|
||||
graph.root,
|
||||
);
|
||||
|
||||
let graph = graphs.add(graph);
|
||||
commands.insert_resource(SuitAnimation { index, graph });
|
||||
|
||||
// Blackout disabled for now
|
||||
// commands.spawn((
|
||||
// BlackOutOverlay,
|
||||
|
@ -139,7 +115,7 @@ pub fn spawn_effects(
|
|||
FadeOut,
|
||||
NodeBundle {
|
||||
style: style_fullscreen(),
|
||||
background_color: color.with_alpha(0.0).into(),
|
||||
background_color: color.with_a(0.0).into(),
|
||||
..default()
|
||||
},
|
||||
));
|
||||
|
@ -160,7 +136,7 @@ pub fn update_fadein(
|
|||
continue;
|
||||
}
|
||||
let alpha = (1.3 - 1.3 * (now - effect.start_time) / effect.duration).clamp(0.0, 1.0);
|
||||
bgcolor.0.set_alpha(alpha as f32);
|
||||
bgcolor.0.set_a(alpha as f32);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -176,25 +152,17 @@ pub fn update_fadeout(
|
|||
continue;
|
||||
}
|
||||
let alpha = ((now - effect.start_time) / effect.duration).clamp(0.0, 1.0);
|
||||
bgcolor.0.set_alpha(alpha as f32);
|
||||
bgcolor.0.set_a(alpha as f32);
|
||||
}
|
||||
}
|
||||
|
||||
fn play_animations(
|
||||
mut commands: Commands,
|
||||
mut players: Query<(Entity, &mut AnimationPlayer), Added<AnimationPlayer>>,
|
||||
suit_animation: Res<SuitAnimation>,
|
||||
mut players: Query<&mut AnimationPlayer, Added<AnimationPlayer>>,
|
||||
asset_server: Res<AssetServer>,
|
||||
) {
|
||||
for (entity, mut player) in &mut players {
|
||||
let mut transitions = AnimationTransitions::new();
|
||||
transitions
|
||||
.play(&mut player, suit_animation.index, Duration::ZERO)
|
||||
.repeat();
|
||||
commands
|
||||
.entity(entity)
|
||||
.insert(suit_animation.graph.clone())
|
||||
.insert(transitions);
|
||||
//player.play(suit_ani_node_index.0).repeat();
|
||||
for mut player in &mut players {
|
||||
let animation = asset_server.load("models/suit_v2/suit_v2.glb#Animation0");
|
||||
player.play(animation.clone()).repeat();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -207,6 +175,6 @@ fn play_animations(
|
|||
// let threshold = 0.3;
|
||||
// let factor = 1.0 / (1.0 - threshold);
|
||||
// let alpha = (factor * (gforce.blackout - threshold)).clamp(0.0, 1.0);
|
||||
// bgcolor.0.set_alpha(alpha as f32);
|
||||
// bgcolor.0.set_a(alpha as f32);
|
||||
// }
|
||||
//}
|
||||
|
|
|
@ -115,7 +115,7 @@ pub fn setup(
|
|||
//(radius as f64 * nature::SOL_RADIUS).powf(0.02) as f32 *
|
||||
|
||||
let star_color_handle = materials.add(StandardMaterial {
|
||||
base_color: Color::srgb(scale_color(r), scale_color(g), scale_color(b)),
|
||||
base_color: Color::rgb(scale_color(r), scale_color(g), scale_color(b)),
|
||||
unlit: true,
|
||||
..default()
|
||||
});
|
||||
|
|
Loading…
Reference in a new issue