rust/hwphysics/src/common.rs
author Wuzzy <Wuzzy2@mail.ru>
Mon, 16 Sep 2019 17:33:49 +0200
changeset 15431 8504fee3b601
parent 15404 701ad89a9f2a
child 15802 f4b563a9ac5e
permissions -rw-r--r--
Racer: Fix weird water splashes after waypoint placement Does not affect official racer, as only waypoint placement is touched. The reason was that the air attack gear sometimes was not deleted fast enough so it might occassionally drop some air bombs (these are deleted now). Also, the airplane position was set to water level, which caused another water splash.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
15303
478d5372eb4a implement empty gear lookup entries
alfadur
parents: 15302
diff changeset
     1
use fpnum::FPNum;
15402
52844baced17 add gravity
alfadur
parents: 15401
diff changeset
     2
use std::{collections::BinaryHeap, num::NonZeroU16, ops::Add};
15295
42b710b0f883 add gear allocator
alfadur
parents: 15284
diff changeset
     3
42b710b0f883 add gear allocator
alfadur
parents: 15284
diff changeset
     4
pub type GearId = NonZeroU16;
15141
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 14200
diff changeset
     5
15296
66c987015f2d replace time with milliseconds
alfadur
parents: 15295
diff changeset
     6
#[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Debug)]
15302
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15296
diff changeset
     7
#[repr(transparent)]
15296
66c987015f2d replace time with milliseconds
alfadur
parents: 15295
diff changeset
     8
pub struct Millis(u32);
66c987015f2d replace time with milliseconds
alfadur
parents: 15295
diff changeset
     9
66c987015f2d replace time with milliseconds
alfadur
parents: 15295
diff changeset
    10
impl Millis {
66c987015f2d replace time with milliseconds
alfadur
parents: 15295
diff changeset
    11
    #[inline]
66c987015f2d replace time with milliseconds
alfadur
parents: 15295
diff changeset
    12
    pub fn new(value: u32) -> Self {
66c987015f2d replace time with milliseconds
alfadur
parents: 15295
diff changeset
    13
        Self(value)
66c987015f2d replace time with milliseconds
alfadur
parents: 15295
diff changeset
    14
    }
66c987015f2d replace time with milliseconds
alfadur
parents: 15295
diff changeset
    15
66c987015f2d replace time with milliseconds
alfadur
parents: 15295
diff changeset
    16
    #[inline]
66c987015f2d replace time with milliseconds
alfadur
parents: 15295
diff changeset
    17
    pub fn get(self) -> u32 {
66c987015f2d replace time with milliseconds
alfadur
parents: 15295
diff changeset
    18
        self.0
66c987015f2d replace time with milliseconds
alfadur
parents: 15295
diff changeset
    19
    }
66c987015f2d replace time with milliseconds
alfadur
parents: 15295
diff changeset
    20
66c987015f2d replace time with milliseconds
alfadur
parents: 15295
diff changeset
    21
    #[inline]
66c987015f2d replace time with milliseconds
alfadur
parents: 15295
diff changeset
    22
    pub fn to_fixed(self) -> FPNum {
15404
701ad89a9f2a avoid time multiplication when not skipping ticks
alfadur
parents: 15402
diff changeset
    23
        FPNum::new(self.0 as i32, 1)
15296
66c987015f2d replace time with milliseconds
alfadur
parents: 15295
diff changeset
    24
    }
66c987015f2d replace time with milliseconds
alfadur
parents: 15295
diff changeset
    25
}
66c987015f2d replace time with milliseconds
alfadur
parents: 15295
diff changeset
    26
66c987015f2d replace time with milliseconds
alfadur
parents: 15295
diff changeset
    27
impl Add for Millis {
66c987015f2d replace time with milliseconds
alfadur
parents: 15295
diff changeset
    28
    type Output = Self;
66c987015f2d replace time with milliseconds
alfadur
parents: 15295
diff changeset
    29
66c987015f2d replace time with milliseconds
alfadur
parents: 15295
diff changeset
    30
    fn add(self, rhs: Self) -> Self::Output {
66c987015f2d replace time with milliseconds
alfadur
parents: 15295
diff changeset
    31
        Self(self.0 + rhs.0)
66c987015f2d replace time with milliseconds
alfadur
parents: 15295
diff changeset
    32
    }
66c987015f2d replace time with milliseconds
alfadur
parents: 15295
diff changeset
    33
}
66c987015f2d replace time with milliseconds
alfadur
parents: 15295
diff changeset
    34
15295
42b710b0f883 add gear allocator
alfadur
parents: 15284
diff changeset
    35
pub struct GearAllocator {
42b710b0f883 add gear allocator
alfadur
parents: 15284
diff changeset
    36
    max_id: u16,
42b710b0f883 add gear allocator
alfadur
parents: 15284
diff changeset
    37
    free_ids: BinaryHeap<GearId>,
42b710b0f883 add gear allocator
alfadur
parents: 15284
diff changeset
    38
}
42b710b0f883 add gear allocator
alfadur
parents: 15284
diff changeset
    39
42b710b0f883 add gear allocator
alfadur
parents: 15284
diff changeset
    40
impl GearAllocator {
42b710b0f883 add gear allocator
alfadur
parents: 15284
diff changeset
    41
    pub fn new() -> Self {
42b710b0f883 add gear allocator
alfadur
parents: 15284
diff changeset
    42
        Self {
42b710b0f883 add gear allocator
alfadur
parents: 15284
diff changeset
    43
            max_id: 0,
42b710b0f883 add gear allocator
alfadur
parents: 15284
diff changeset
    44
            free_ids: BinaryHeap::with_capacity(1024),
42b710b0f883 add gear allocator
alfadur
parents: 15284
diff changeset
    45
        }
42b710b0f883 add gear allocator
alfadur
parents: 15284
diff changeset
    46
    }
42b710b0f883 add gear allocator
alfadur
parents: 15284
diff changeset
    47
42b710b0f883 add gear allocator
alfadur
parents: 15284
diff changeset
    48
    pub fn alloc(&mut self) -> Option<GearId> {
42b710b0f883 add gear allocator
alfadur
parents: 15284
diff changeset
    49
        self.free_ids.pop().or_else(|| {
42b710b0f883 add gear allocator
alfadur
parents: 15284
diff changeset
    50
            self.max_id.checked_add(1).and_then(|new_max_id| {
42b710b0f883 add gear allocator
alfadur
parents: 15284
diff changeset
    51
                self.max_id = new_max_id;
42b710b0f883 add gear allocator
alfadur
parents: 15284
diff changeset
    52
                NonZeroU16::new(new_max_id)
42b710b0f883 add gear allocator
alfadur
parents: 15284
diff changeset
    53
            })
42b710b0f883 add gear allocator
alfadur
parents: 15284
diff changeset
    54
        })
42b710b0f883 add gear allocator
alfadur
parents: 15284
diff changeset
    55
    }
42b710b0f883 add gear allocator
alfadur
parents: 15284
diff changeset
    56
42b710b0f883 add gear allocator
alfadur
parents: 15284
diff changeset
    57
    pub fn free(&mut self, gear_id: GearId) {
42b710b0f883 add gear allocator
alfadur
parents: 15284
diff changeset
    58
        self.free_ids.push(gear_id)
42b710b0f883 add gear allocator
alfadur
parents: 15284
diff changeset
    59
    }
42b710b0f883 add gear allocator
alfadur
parents: 15284
diff changeset
    60
}