mirror of
https://codeberg.org/demostf/parser.git
synced 2026-06-04 02:24:12 +02:00
remove the need to read raw game event before transforming into game event
This commit is contained in:
parent
b517df0e57
commit
36077864ad
6 changed files with 6032 additions and 5027 deletions
|
|
@ -1,8 +1,9 @@
|
|||
use bitbuffer::{BitRead, BitWrite};
|
||||
|
||||
use crate::{ParseError, Result};
|
||||
use crate::{GameEventError, ParseError, Result, Stream};
|
||||
|
||||
pub use super::gameevent_gen::{GameEvent, GameEventType};
|
||||
use crate::demo::handle_utf8_error;
|
||||
use crate::demo::message::gameevent::GameEventTypeId;
|
||||
use parse_display::Display;
|
||||
use std::cmp::Ordering;
|
||||
|
|
@ -65,6 +66,21 @@ pub enum GameEventValue {
|
|||
Local,
|
||||
}
|
||||
|
||||
fn read_event_value(stream: &mut Stream, definition: &GameEventEntry) -> Result<GameEventValue> {
|
||||
Ok(match definition.kind {
|
||||
GameEventValueType::String => {
|
||||
GameEventValue::String(stream.read().or_else(handle_utf8_error)?)
|
||||
}
|
||||
GameEventValueType::Float => GameEventValue::Float(stream.read()?),
|
||||
GameEventValueType::Long => GameEventValue::Long(stream.read()?),
|
||||
GameEventValueType::Short => GameEventValue::Short(stream.read()?),
|
||||
GameEventValueType::Byte => GameEventValue::Byte(stream.read()?),
|
||||
GameEventValueType::Boolean => GameEventValue::Boolean(stream.read()?),
|
||||
GameEventValueType::Local => GameEventValue::Local,
|
||||
GameEventValueType::None => return Err(GameEventError::NoneValue.into()),
|
||||
})
|
||||
}
|
||||
|
||||
impl GameEventValue {
|
||||
pub fn get_type(&self) -> GameEventValueType {
|
||||
match self {
|
||||
|
|
@ -81,6 +97,8 @@ impl GameEventValue {
|
|||
|
||||
pub trait FromGameEventValue: Sized {
|
||||
fn from_value(value: Option<GameEventValue>, name: &'static str) -> Result<Self>;
|
||||
|
||||
fn value_type() -> GameEventValueType;
|
||||
}
|
||||
|
||||
impl FromGameEventValue for String {
|
||||
|
|
@ -95,6 +113,10 @@ impl FromGameEventValue for String {
|
|||
}),
|
||||
}
|
||||
}
|
||||
|
||||
fn value_type() -> GameEventValueType {
|
||||
GameEventValueType::String
|
||||
}
|
||||
}
|
||||
|
||||
impl FromGameEventValue for f32 {
|
||||
|
|
@ -109,6 +131,10 @@ impl FromGameEventValue for f32 {
|
|||
}),
|
||||
}
|
||||
}
|
||||
|
||||
fn value_type() -> GameEventValueType {
|
||||
GameEventValueType::Float
|
||||
}
|
||||
}
|
||||
|
||||
impl FromGameEventValue for u32 {
|
||||
|
|
@ -125,6 +151,10 @@ impl FromGameEventValue for u32 {
|
|||
}),
|
||||
}
|
||||
}
|
||||
|
||||
fn value_type() -> GameEventValueType {
|
||||
GameEventValueType::Long
|
||||
}
|
||||
}
|
||||
|
||||
impl FromGameEventValue for u16 {
|
||||
|
|
@ -141,6 +171,10 @@ impl FromGameEventValue for u16 {
|
|||
}),
|
||||
}
|
||||
}
|
||||
|
||||
fn value_type() -> GameEventValueType {
|
||||
GameEventValueType::Short
|
||||
}
|
||||
}
|
||||
|
||||
impl FromGameEventValue for u8 {
|
||||
|
|
@ -157,6 +191,10 @@ impl FromGameEventValue for u8 {
|
|||
}),
|
||||
}
|
||||
}
|
||||
|
||||
fn value_type() -> GameEventValueType {
|
||||
GameEventValueType::Byte
|
||||
}
|
||||
}
|
||||
|
||||
impl FromGameEventValue for bool {
|
||||
|
|
@ -171,6 +209,10 @@ impl FromGameEventValue for bool {
|
|||
}),
|
||||
}
|
||||
}
|
||||
|
||||
fn value_type() -> GameEventValueType {
|
||||
GameEventValueType::Boolean
|
||||
}
|
||||
}
|
||||
|
||||
impl FromGameEventValue for () {
|
||||
|
|
@ -184,6 +226,10 @@ impl FromGameEventValue for () {
|
|||
}),
|
||||
}
|
||||
}
|
||||
|
||||
fn value_type() -> GameEventValueType {
|
||||
GameEventValueType::Local
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
|
|
@ -192,6 +238,20 @@ pub struct RawGameEvent {
|
|||
pub values: Vec<GameEventValue>,
|
||||
}
|
||||
|
||||
impl RawGameEvent {
|
||||
pub fn read(stream: &mut Stream, definition: &GameEventDefinition) -> Result<Self> {
|
||||
let mut values: Vec<GameEventValue> = Vec::with_capacity(definition.entries.len());
|
||||
for entry in &definition.entries {
|
||||
values.push(read_event_value(stream, &entry)?);
|
||||
}
|
||||
|
||||
Ok(RawGameEvent {
|
||||
event_type: definition.event_type,
|
||||
values,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
pub trait FromRawGameEvent: Sized {
|
||||
fn from_raw_event(values: Vec<GameEventValue>) -> Result<Self>;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue