implement god mode

This commit is contained in:
yuni 2024-04-08 01:44:36 +02:00
parent f412612f9f
commit a44a7faa42
4 changed files with 42 additions and 12 deletions

View file

@ -43,6 +43,7 @@ Links:
- T: Toggle music
- M: Toggle sound effects
- Cheats
- G: Toggle god mode / cheats
- V/B: Impossible acceleration forward/backward
- Shift+V/B: Same as V/B, but a thousand times faster
- C: Impossibly instant stopping
@ -155,6 +156,7 @@ python -m http.server -d wasm
- Implement targeting objects with left click (AR only)
- Implement matching velocity to targeted objects with space
- Implement damage from g-forces, passing out
- Implement god mode
- Fix crash by avoiding legacy fullscreen mode
- v0.5.3:
- Implement death & respawning

View file

@ -403,8 +403,12 @@ fn handle_player_death(
mut ew_sfx: EventWriter<audio::PlaySfxEvent>,
mut ew_effect: EventWriter<effects::SpawnEffectEvent>,
mut log: ResMut<hud::Log>,
settings: Res<settings::Settings>,
) {
for _ in er_playerdies.read() {
if settings.god_mode {
return;
}
for entity in &q_noscenes {
cmd.entity(entity).despawn();
}
@ -427,21 +431,28 @@ fn handle_player_death(
fn handle_damage(
mut ew_playerdies: EventWriter<PlayerDiesEvent>,
mut q_hp: Query<(&mut HitPoints, Option<&Player>), Changed<HitPoints>>,
settings: Res<settings::Settings>,
) {
for (mut hp, player_maybe) in &mut q_hp {
hp.current -= hp.damage;
hp.damage = 0.0;
if player_maybe.is_some() {
if !settings.god_mode {
hp.current -= hp.damage;
}
if hp.current <= 0.0 {
ew_playerdies.send(PlayerDiesEvent);
}
}
else {
hp.current -= hp.damage;
}
hp.damage = 0.0;
}
}
fn handle_gforce(
time: Res<Time>,
mut q_actor: Query<(&LinearVelocity, &mut HitPoints, &mut ExperiencesGForce)>,
settings: Res<settings::Settings>,
) {
let dt = time.delta_seconds();
let factor = 1.0 / dt / 9.81;
@ -457,14 +468,16 @@ fn handle_gforce(
hp.damage += (gforce.gforce - gforce.damage_threshold).powf(2.0) / 3000.0;
}
if gforce.blackout > 0.0001 {
gforce.blackout *= 0.984;
}
else if gforce.blackout > 0.0 {
gforce.blackout = 0.0;
}
if gforce.gforce > gforce.blackout_threshold {
gforce.blackout += (gforce.gforce - gforce.blackout_threshold).powf(2.0) / 300000.0
if !settings.god_mode {
if gforce.blackout > 0.0001 {
gforce.blackout *= 0.984;
}
else if gforce.blackout > 0.0 {
gforce.blackout = 0.0;
}
if gforce.gforce > gforce.blackout_threshold {
gforce.blackout += (gforce.gforce - gforce.blackout_threshold).powf(2.0) / 300000.0
}
}
}
}

View file

@ -4,6 +4,7 @@ use std::env;
#[derive(Resource)]
pub struct Settings {
pub dev_mode: bool,
pub god_mode: bool,
pub mute_sfx: bool,
pub mute_music: bool,
pub volume_sfx: u8,
@ -50,6 +51,7 @@ pub struct Settings {
pub key_reply8: KeyCode,
pub key_reply9: KeyCode,
pub key_reply10: KeyCode,
pub key_cheat_god_mode: KeyCode,
pub key_cheat_stop: KeyCode,
pub key_cheat_speed: KeyCode,
pub key_cheat_speed_backward: KeyCode,
@ -82,6 +84,7 @@ impl Default for Settings {
Settings {
dev_mode: dev_mode,
god_mode: false,
mute_sfx: default_mute_sfx,
mute_music: default_mute_music,
volume_sfx: 100,
@ -128,6 +131,7 @@ impl Default for Settings {
key_reply8: KeyCode::Digit8,
key_reply9: KeyCode::Digit9,
key_reply10: KeyCode::Digit0,
key_cheat_god_mode: KeyCode::KeyG,
key_cheat_stop: KeyCode::KeyC,
key_cheat_speed: KeyCode::KeyV,
key_cheat_speed_backward: KeyCode::KeyB,

View file

@ -1,4 +1,4 @@
use crate::{actor, hud, nature, settings, stars};
use crate::{actor, audio, hud, nature, settings, stars};
use bevy::prelude::*;
use bevy::render::render_resource::{AsBindGroup, ShaderRef};
use bevy::math::{DVec3, I64Vec3};
@ -378,7 +378,8 @@ fn handle_cheats(
mut q_player: Query<(&Transform, &mut Position, &mut LinearVelocity), With<actor::PlayerCamera>>,
mut q_life: Query<(&mut actor::LifeForm, &mut actor::ExperiencesGForce), With<actor::Player>>,
mut ew_playerdies: EventWriter<actor::PlayerDiesEvent>,
settings: ResMut<settings::Settings>,
mut settings: ResMut<settings::Settings>,
mut ew_sfx: EventWriter<audio::PlaySfxEvent>,
) {
if q_player.is_empty() || q_life.is_empty() {
return;
@ -390,6 +391,16 @@ fn handle_cheats(
} else {
1e3
};
if key_input.just_pressed(settings.key_cheat_god_mode) {
settings.god_mode ^= true;
if settings.god_mode {
ew_sfx.send(audio::PlaySfxEvent(audio::Sfx::EnterVehicle));
}
}
if !settings.god_mode && !settings.dev_mode {
return;
}
if key_input.just_pressed(settings.key_cheat_stop) {
gforce.ignore_gforce_seconds = 1.0;
v.0 = DVec3::ZERO;