add Id2V resource, "wants matchvelocitywith" command
This commit is contained in:
parent
46a030f15e
commit
3d26b0915d
15
src/actor.rs
15
src/actor.rs
|
@ -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 {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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"
|
||||
|
|
11
src/game.rs
11
src/game.rs
|
@ -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>>,
|
||||
|
|
Loading…
Reference in a new issue