rust/lib-hedgewars-engine/src/world.rs
author Wuzzy <Wuzzy2@mail.ru>
Tue, 09 Apr 2019 00:45:14 +0200
changeset 14783 bbec6b28d072
parent 14723 5915a199cb81
child 15195 e2adb40c7988
permissions -rw-r--r--
Fix bugs when entering speech bubble commands during hog placement phase
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
14721
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14720
diff changeset
     1
use fpnum::{fp, FPNum, FPPoint};
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14720
diff changeset
     2
use hwphysics::{self as hwp, common::GearId};
14159
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
     3
use integral_geometry::{Point, Rect, Size};
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
     4
use land2d::Land2D;
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
     5
use landgen::{
14710
19122a329774 make world renderer optional + fmt
alfadur
parents: 14709
diff changeset
     6
    outline_template::OutlineTemplate, template_based::TemplatedLandGenerator,
19122a329774 make world renderer optional + fmt
alfadur
parents: 14709
diff changeset
     7
    LandGenerationParameters, LandGenerator,
14159
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
     8
};
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
     9
use lfprng::LaggedFibonacciPRNG;
14300
fd8e0e52d5bd add hwphysics to engine
alfadur
parents: 14277
diff changeset
    10
14710
19122a329774 make world renderer optional + fmt
alfadur
parents: 14709
diff changeset
    11
use crate::render::{camera::Camera, MapRenderer};
14707
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents: 14378
diff changeset
    12
14300
fd8e0e52d5bd add hwphysics to engine
alfadur
parents: 14277
diff changeset
    13
struct GameState {
fd8e0e52d5bd add hwphysics to engine
alfadur
parents: 14277
diff changeset
    14
    land: Land2D<u32>,
fd8e0e52d5bd add hwphysics to engine
alfadur
parents: 14277
diff changeset
    15
    physics: hwp::World,
fd8e0e52d5bd add hwphysics to engine
alfadur
parents: 14277
diff changeset
    16
}
fd8e0e52d5bd add hwphysics to engine
alfadur
parents: 14277
diff changeset
    17
fd8e0e52d5bd add hwphysics to engine
alfadur
parents: 14277
diff changeset
    18
impl GameState {
fd8e0e52d5bd add hwphysics to engine
alfadur
parents: 14277
diff changeset
    19
    fn new(land: Land2D<u32>, physics: hwp::World) -> Self {
14710
19122a329774 make world renderer optional + fmt
alfadur
parents: 14709
diff changeset
    20
        Self { land, physics }
14300
fd8e0e52d5bd add hwphysics to engine
alfadur
parents: 14277
diff changeset
    21
    }
fd8e0e52d5bd add hwphysics to engine
alfadur
parents: 14277
diff changeset
    22
}
14159
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
    23
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
    24
pub struct World {
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
    25
    random_numbers_gen: LaggedFibonacciPRNG,
14378
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14300
diff changeset
    26
    preview: Option<Land2D<u8>>,
14300
fd8e0e52d5bd add hwphysics to engine
alfadur
parents: 14277
diff changeset
    27
    game_state: Option<GameState>,
14710
19122a329774 make world renderer optional + fmt
alfadur
parents: 14709
diff changeset
    28
    renderer: Option<MapRenderer>,
19122a329774 make world renderer optional + fmt
alfadur
parents: 14709
diff changeset
    29
    camera: Camera,
14721
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14720
diff changeset
    30
    last_gear_id: GearId,
14159
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
    31
}
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
    32
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
    33
impl World {
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
    34
    pub fn new() -> Self {
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
    35
        Self {
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
    36
            random_numbers_gen: LaggedFibonacciPRNG::new(&[]),
14378
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14300
diff changeset
    37
            preview: None,
14300
fd8e0e52d5bd add hwphysics to engine
alfadur
parents: 14277
diff changeset
    38
            game_state: None,
14710
19122a329774 make world renderer optional + fmt
alfadur
parents: 14709
diff changeset
    39
            renderer: None,
19122a329774 make world renderer optional + fmt
alfadur
parents: 14709
diff changeset
    40
            camera: Camera::new(),
14721
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14720
diff changeset
    41
            last_gear_id: GearId::default(),
14159
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
    42
        }
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
    43
    }
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
    44
14710
19122a329774 make world renderer optional + fmt
alfadur
parents: 14709
diff changeset
    45
    pub fn create_renderer(&mut self, width: u16, height: u16) {
14719
4df1aac5f090 a bit of cleanup
alfadur
parents: 14716
diff changeset
    46
        let land_tile_size = Size::square(512);
4df1aac5f090 a bit of cleanup
alfadur
parents: 14716
diff changeset
    47
        self.renderer = Some(MapRenderer::new(land_tile_size));
14710
19122a329774 make world renderer optional + fmt
alfadur
parents: 14709
diff changeset
    48
        self.camera = Camera::with_size(Size::new(width as usize, height as usize));
14713
19358c313ebb fix texture initialization
alfadur
parents: 14710
diff changeset
    49
19358c313ebb fix texture initialization
alfadur
parents: 14710
diff changeset
    50
        use mapgen::{theme::Theme, MapGenerator};
19358c313ebb fix texture initialization
alfadur
parents: 14710
diff changeset
    51
        use std::path::Path;
19358c313ebb fix texture initialization
alfadur
parents: 14710
diff changeset
    52
19358c313ebb fix texture initialization
alfadur
parents: 14710
diff changeset
    53
        if let Some(ref state) = self.game_state {
14716
40809bfd44af center camera on land
alfadur
parents: 14715
diff changeset
    54
            self.camera.position = state.land.play_box().center();
14719
4df1aac5f090 a bit of cleanup
alfadur
parents: 14716
diff changeset
    55
14713
19358c313ebb fix texture initialization
alfadur
parents: 14710
diff changeset
    56
            let theme =
19358c313ebb fix texture initialization
alfadur
parents: 14710
diff changeset
    57
                Theme::load(Path::new("../../share/hedgewars/Data/Themes/Cheese/")).unwrap();
14715
946df0bb3b28 collapse mapgen back
alfadur
parents: 14714
diff changeset
    58
            let texture = MapGenerator::new().make_texture(&state.land, &theme);
14713
19358c313ebb fix texture initialization
alfadur
parents: 14710
diff changeset
    59
            if let Some(ref mut renderer) = self.renderer {
19358c313ebb fix texture initialization
alfadur
parents: 14710
diff changeset
    60
                renderer.init(&texture);
19358c313ebb fix texture initialization
alfadur
parents: 14710
diff changeset
    61
            }
19358c313ebb fix texture initialization
alfadur
parents: 14710
diff changeset
    62
        }
14710
19122a329774 make world renderer optional + fmt
alfadur
parents: 14709
diff changeset
    63
    }
19122a329774 make world renderer optional + fmt
alfadur
parents: 14709
diff changeset
    64
14277
3152d9fdb499 - Move EngineInstance into a separate module
unC0Rr
parents: 14171
diff changeset
    65
    pub fn set_seed(&mut self, seed: &[u8]) {
3152d9fdb499 - Move EngineInstance into a separate module
unC0Rr
parents: 14171
diff changeset
    66
        self.random_numbers_gen = LaggedFibonacciPRNG::new(seed);
3152d9fdb499 - Move EngineInstance into a separate module
unC0Rr
parents: 14171
diff changeset
    67
    }
3152d9fdb499 - Move EngineInstance into a separate module
unC0Rr
parents: 14171
diff changeset
    68
14378
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14300
diff changeset
    69
    pub fn preview(&self) -> &Option<Land2D<u8>> {
14159
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
    70
        &self.preview
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
    71
    }
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
    72
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
    73
    pub fn generate_preview(&mut self) {
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
    74
        fn template() -> OutlineTemplate {
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
    75
            let mut template = OutlineTemplate::new(Size::new(4096, 2048));
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
    76
            template.islands = vec![vec![
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
    77
                Rect::from_size_coords(100, 2050, 1, 1),
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
    78
                Rect::from_size_coords(100, 500, 400, 1200),
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
    79
                Rect::from_size_coords(3600, 500, 400, 1200),
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
    80
                Rect::from_size_coords(3900, 2050, 1, 1),
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
    81
            ]];
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
    82
            template.fill_points = vec![Point::new(1, 0)];
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
    83
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
    84
            template
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
    85
        }
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
    86
14300
fd8e0e52d5bd add hwphysics to engine
alfadur
parents: 14277
diff changeset
    87
        let params = LandGenerationParameters::new(0u8, u8::max_value(), 5, false, false);
14159
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
    88
        let landgen = TemplatedLandGenerator::new(template());
14378
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14300
diff changeset
    89
        self.preview = Some(landgen.generate_land(&params, &mut self.random_numbers_gen));
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14300
diff changeset
    90
    }
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14300
diff changeset
    91
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14300
diff changeset
    92
    pub fn dispose_preview(&mut self) {
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14300
diff changeset
    93
        self.preview = None
14159
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
    94
    }
14300
fd8e0e52d5bd add hwphysics to engine
alfadur
parents: 14277
diff changeset
    95
fd8e0e52d5bd add hwphysics to engine
alfadur
parents: 14277
diff changeset
    96
    pub fn init(&mut self, template: OutlineTemplate) {
fd8e0e52d5bd add hwphysics to engine
alfadur
parents: 14277
diff changeset
    97
        let physics = hwp::World::new(template.size);
fd8e0e52d5bd add hwphysics to engine
alfadur
parents: 14277
diff changeset
    98
fd8e0e52d5bd add hwphysics to engine
alfadur
parents: 14277
diff changeset
    99
        let params = LandGenerationParameters::new(0u32, u32::max_value(), 5, false, false);
fd8e0e52d5bd add hwphysics to engine
alfadur
parents: 14277
diff changeset
   100
        let landgen = TemplatedLandGenerator::new(template);
fd8e0e52d5bd add hwphysics to engine
alfadur
parents: 14277
diff changeset
   101
        let land = landgen.generate_land(&params, &mut self.random_numbers_gen);
fd8e0e52d5bd add hwphysics to engine
alfadur
parents: 14277
diff changeset
   102
fd8e0e52d5bd add hwphysics to engine
alfadur
parents: 14277
diff changeset
   103
        self.game_state = Some(GameState::new(land, physics));
fd8e0e52d5bd add hwphysics to engine
alfadur
parents: 14277
diff changeset
   104
    }
fd8e0e52d5bd add hwphysics to engine
alfadur
parents: 14277
diff changeset
   105
14709
12db7e435ea6 move camera into engine
alfadur
parents: 14707
diff changeset
   106
    pub fn move_camera(&mut self, position_shift: Point, zoom_shift: f32) {
12db7e435ea6 move camera into engine
alfadur
parents: 14707
diff changeset
   107
        self.camera.zoom += zoom_shift;
14714
65c971417780 fix zoom
alfadur
parents: 14713
diff changeset
   108
        self.camera.position += Point::new(
65c971417780 fix zoom
alfadur
parents: 14713
diff changeset
   109
            (position_shift.x as f32 / self.camera.zoom) as i32,
65c971417780 fix zoom
alfadur
parents: 14713
diff changeset
   110
            (position_shift.y as f32 / self.camera.zoom) as i32,
65c971417780 fix zoom
alfadur
parents: 14713
diff changeset
   111
        );
14709
12db7e435ea6 move camera into engine
alfadur
parents: 14707
diff changeset
   112
    }
12db7e435ea6 move camera into engine
alfadur
parents: 14707
diff changeset
   113
12db7e435ea6 move camera into engine
alfadur
parents: 14707
diff changeset
   114
    pub fn render(&mut self) {
14710
19122a329774 make world renderer optional + fmt
alfadur
parents: 14709
diff changeset
   115
        if let Some(ref mut renderer) = self.renderer {
19122a329774 make world renderer optional + fmt
alfadur
parents: 14709
diff changeset
   116
            unsafe {
19122a329774 make world renderer optional + fmt
alfadur
parents: 14709
diff changeset
   117
                gl::ClearColor(0.4f32, 0f32, 0.2f32, 1f32);
19122a329774 make world renderer optional + fmt
alfadur
parents: 14709
diff changeset
   118
                gl::Clear(gl::COLOR_BUFFER_BIT);
19122a329774 make world renderer optional + fmt
alfadur
parents: 14709
diff changeset
   119
            }
14709
12db7e435ea6 move camera into engine
alfadur
parents: 14707
diff changeset
   120
14723
5915a199cb81 move projection matrix into camera
alfadur
parents: 14721
diff changeset
   121
            renderer.render(&self.camera);
14707
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents: 14378
diff changeset
   122
        }
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents: 14378
diff changeset
   123
    }
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents: 14378
diff changeset
   124
14721
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14720
diff changeset
   125
    fn get_unused_gear_id(&mut self) -> GearId {
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14720
diff changeset
   126
        let id = self.last_gear_id;
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14720
diff changeset
   127
        self.last_gear_id += 1;
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14720
diff changeset
   128
        id
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14720
diff changeset
   129
    }
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14720
diff changeset
   130
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14720
diff changeset
   131
    fn create_gear(&mut self, position: Point) {
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14720
diff changeset
   132
        let id = self.get_unused_gear_id();
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14720
diff changeset
   133
        if let Some(ref mut state) = self.game_state {
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14720
diff changeset
   134
            let fp_position = FPPoint::new(position.x.into(), position.y.into());
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14720
diff changeset
   135
            state.physics.add_gear_data(
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14720
diff changeset
   136
                id,
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14720
diff changeset
   137
                hwp::physics::PhysicsData::new(fp_position, FPPoint::zero()),
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14720
diff changeset
   138
            )
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14720
diff changeset
   139
        }
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14720
diff changeset
   140
    }
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14720
diff changeset
   141
14300
fd8e0e52d5bd add hwphysics to engine
alfadur
parents: 14277
diff changeset
   142
    pub fn step(&mut self) {
fd8e0e52d5bd add hwphysics to engine
alfadur
parents: 14277
diff changeset
   143
        if let Some(ref mut state) = self.game_state {
14721
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14720
diff changeset
   144
            let next = self.random_numbers_gen.next().unwrap();
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14720
diff changeset
   145
            if next % 32 == 0 {
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14720
diff changeset
   146
                let position = Point::new(
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14720
diff changeset
   147
                    (self.random_numbers_gen.next().unwrap() % state.land.width() as u32) as i32,
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14720
diff changeset
   148
                    0,
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14720
diff changeset
   149
                );
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14720
diff changeset
   150
                self.create_gear(position);
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14720
diff changeset
   151
            }
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14720
diff changeset
   152
        }
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14720
diff changeset
   153
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14720
diff changeset
   154
        if let Some(ref mut state) = self.game_state {
14300
fd8e0e52d5bd add hwphysics to engine
alfadur
parents: 14277
diff changeset
   155
            state.physics.step(fp!(1), &state.land);
fd8e0e52d5bd add hwphysics to engine
alfadur
parents: 14277
diff changeset
   156
        }
fd8e0e52d5bd add hwphysics to engine
alfadur
parents: 14277
diff changeset
   157
    }
14159
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
   158
}