add Id2V resource, "wants matchvelocitywith" command

This commit is contained in:
yuni 2024-06-11 02:46:31 +02:00
parent 46a030f15e
commit 3d26b0915d
4 changed files with 47 additions and 2 deletions

View file

@ -164,6 +164,8 @@ pub struct WantsMaxVelocity(pub f64);
#[derive(Component)]
pub struct WantsToLookAt(pub String);
#[derive(Component)]
pub struct WantsMatchVelocityWith(pub String);
#[derive(Component)]
pub struct Identifier(pub String);
#[derive(Component)]
pub struct OrbitsJupiter;
@ -554,12 +556,21 @@ fn handle_wants_maxvelocity(
&Engine,
&WantsMaxVelocity,
Option<&OrbitsJupiter>,
Option<&WantsMatchVelocityWith>,
)>,
id2v: Res<game::Id2V>,
jupiter_pos: Res<game::JupiterPos>,
) {
let dt = time.delta_seconds();
for (pos, mut v, engine, maxv, orbits_jupiter) in &mut query {
let target_velocity = if orbits_jupiter.is_some() {
for (pos, mut v, engine, maxv, orbits_jupiter, matchwith) in &mut query {
let target_velocity = if let Some(matchwith) = matchwith {
if let Some(target_v) = id2v.0.get(&matchwith.0) {
*target_v
} else {
warn!("Can't match velocity with nonexisting ID {}", matchwith.0);
continue;
}
} else if orbits_jupiter.is_some() {
let relative_pos = pos.0 - jupiter_pos.0;
nature::orbital_velocity(relative_pos, nature::JUPITER_MASS)
} else {

View file

@ -86,6 +86,7 @@ struct ParserState {
wants_maxrotation: Option<f64>,
wants_maxvelocity: Option<f64>,
wants_tolookat_id: Option<String>,
wants_matchvelocity_id: Option<String>,
collider_is_mesh: bool,
collider_is_one_mesh_of_scene: bool,
thrust_forward: f32,
@ -143,6 +144,7 @@ impl Default for ParserState {
wants_maxrotation: None,
wants_maxvelocity: None,
wants_tolookat_id: None,
wants_matchvelocity_id: None,
collider_is_mesh: false,
collider_is_one_mesh_of_scene: false,
thrust_forward: default_engine.thrust_forward,
@ -582,6 +584,10 @@ pub fn load_defs(mut ew_spawn: EventWriter<SpawnEvent>) {
// NOTE: Will not work if the actor has no engine
state.wants_tolookat_id = Some(id.to_string());
}
["wants", "matchvelocitywith", id] => {
// NOTE: Will not work if the actor has no engine
state.wants_matchvelocity_id = Some(id.to_string());
}
["armodel", asset_name] => {
state.ar_model = Some(asset_name.to_string());
}
@ -815,6 +821,9 @@ fn spawn_entities(
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 {

View file

@ -288,6 +288,7 @@ actor -55e3 44e3 0 suitv2
name "Yuni"
chatid Yuni
rotationx 180
wants matchvelocitywith thebe
actor 5000 0 -3000 moonlet
name Moonlet
@ -309,12 +310,14 @@ actor 13200 300 -3000 hollow_asteroid
actor 0 0 0 suitv2
template person
relativeto cultasteroid
wants matchvelocitywith cultasteroid
name "Ash"
chatid Ash
pronoun they
actor -8 8 0 suitv2
template person
relativeto cultasteroid
wants matchvelocitywith cultasteroid
name "River"
chatid River
rotationy 54
@ -443,6 +446,7 @@ actor -3300 10 0 pizzeria
relativeto pizzeria
armodel clippy_ar
wants lookat PLAYERCAMERA
wants matchvelocitywith pizzeria
rotationy -126
chatid SubduedClippy
@ -453,6 +457,7 @@ actor -3300 10 0 pizzeria
chatid PizzaChef
armodel suit_ar_chefhat
wants lookat PLAYERCAMERA
wants matchvelocitywith pizzeria
rotationy -90
pronoun he
@ -465,6 +470,7 @@ actor 30 -12 -40 suitv2
armodel suit_ar_wings
angularmomentum 0.4 0.2 0.1
wants maxrotation 0.5
wants matchvelocitywith pizzeria
rotationy 108
rotationx 180
pronoun it
@ -496,6 +502,7 @@ actor -300 0 40 suitv2
name "梓涵"
chatid Drifter
alive no
wants maxvelocity none
oxygen 0.08
pronoun she
@ -506,12 +513,14 @@ actor 100 -18000 2000 clippy
name "StarTrans Clippy™ Serenity Station"
armodel clippy_ar
wants lookat PLAYERCAMERA
wants matchvelocitywith orbbusstopserenity
rotationy -90
chatid ClippyTransSerenity
actor 60 0 0 "orb_busstop"
name "StarTrans Bus Stop: Serenity Station"
relativeto busstopclippy
id orbbusstopserenity
scale 5
actor 80 0 0 "orb_busstop"
name "StarTrans Bus Stop: Serenity Station"
@ -638,6 +647,7 @@ actor 100 -18000 2000 clippy
actor 8 20 0 suitv2
template person
relativeto "busstopclippy"
wants matchvelocitywith orbbusstopserenity
name "Rudy"
chatid NPCinCryoStasis
pronoun he
@ -649,12 +659,14 @@ actor -184971e3 149410e3 -134273e3 clippy
name "StarTrans Clippy™ Farview Station"
armodel clippy_ar
wants lookat PLAYERCAMERA
wants matchvelocitywith orbbusstopfarview
rotationy -90
chatid ClippyTransFarview
actor 60 0 0 "orb_busstop"
name "StarTrans Bus Stop: Farview Station"
relativeto busstopclippy2
id orbbusstopfarview
scale 5
actor 80 0 0 "orb_busstop"
name "StarTrans Bus Stop: Farview Station"
@ -786,6 +798,7 @@ actor 0 -44e3 0 clippy
name "StarTrans Clippy™ Metis Prime Station"
armodel clippy_ar
wants lookat PLAYERCAMERA
wants matchvelocitywith orbbusstopmetis
orbitaround jupiter 128000e3
orbit_phase_offset -0.002
rotationy -90
@ -794,6 +807,7 @@ actor 0 -44e3 0 clippy
actor 60 0 0 "orb_busstop"
name "StarTrans Bus Stop: Metis Prime Station"
relativeto busstopclippy3
id orbbusstopmetis
scale 5
actor 80 0 0 "orb_busstop"
name "StarTrans Bus Stop: Metis Prime Station"

View file

@ -26,12 +26,14 @@ impl Plugin for GamePlugin {
app.add_systems(PostUpdate, handle_game_event);
app.add_systems(PreUpdate, handle_player_death);
app.add_systems(PostUpdate, update_id2pos);
app.add_systems(PostUpdate, update_id2v);
app.add_systems(
Update,
handle_achievement_event.run_if(on_event::<AchievementEvent>()),
);
app.add_systems(Update, check_achievements);
app.insert_resource(Id2Pos(HashMap::new()));
app.insert_resource(Id2V(HashMap::new()));
app.insert_resource(JupiterPos(DVec3::ZERO));
app.insert_resource(var::AchievementTracker::default());
app.insert_resource(var::Settings::default());
@ -51,6 +53,8 @@ pub struct PlayerDiesEvent(pub actor::DamageType);
#[derive(Resource)]
pub struct Id2Pos(pub HashMap<String, DVec3>);
#[derive(Resource)]
pub struct Id2V(pub HashMap<String, DVec3>);
#[derive(Resource)]
pub struct JupiterPos(pub DVec3);
#[derive(Resource)]
pub struct AchievementCheckTimer(pub Timer);
@ -368,6 +372,13 @@ fn update_id2pos(
}
}
fn update_id2v(mut id2v: ResMut<Id2V>, q_id: Query<(&LinearVelocity, &actor::Identifier)>) {
id2v.0.clear();
for (v, id) in &q_id {
id2v.0.insert(id.0.clone(), v.0);
}
}
fn debug(
settings: Res<var::Settings>,
keyboard_input: Res<ButtonInput<KeyCode>>,