This commit is contained in:
Robin Appelman 2022-08-26 01:24:43 +02:00
commit 23c0f49a8c
5 changed files with 20 additions and 7 deletions

2
Cargo.lock generated
View file

@ -562,7 +562,7 @@ dependencies = [
[[package]]
name = "tf-demo-parser"
version = "0.4.0"
source = "git+https://github.com/demostf/parser#307a6cf9535d1a906b0c1c4e2fb88d48a497d509"
source = "git+https://github.com/demostf/parser#cb65c0d3ec07ad67587817e7475db5585e1b245f"
dependencies = [
"bitbuffer",
"enumflags2",

View file

@ -26,6 +26,7 @@ wasm-opt = false
wasm-bindgen = "0.2.45"
wee_alloc = { version = "0.4.2", optional = true }
web-sys = { version = "0.3.22", features = ["console"] }
js-sys = "0.3.22"
tf-demo-parser = { version = "0.4", git = "https://github.com/demostf/parser" }
#tf-demo-parser = { version = "0.4", path = "../tf-demo-parser" }

View file

@ -1,8 +1,8 @@
import {FlatState, XY} from '../pkg/index';
export async function parseDemo(bytes: Uint8Array): Promise<ParsedDemo> {
export async function parseDemo(bytes: Uint8Array, progressCallback : (progress: number) => void): Promise<ParsedDemo> {
let m = await import("../pkg/index.js");
const state = m.parse_demo(bytes);
const state = m.parse_demo(bytes, progressCallback);
let playerCount = state.player_count;
let buildingCount = state.building_count;

View file

@ -10,7 +10,7 @@ window.addEventListener('DOMContentLoaded', () => {
let bytes = new Uint8Array(reader.result as ArrayBuffer);
console.time('demo_parse');
let parsed = await parseDemo(bytes);
let parsed = await parseDemo(bytes, () => {});
console.timeEnd('demo_parse');
console.log(parsed.getPlayer(150, 2));
};

View file

@ -1,6 +1,7 @@
#![macro_use]
use crate::state::ParsedDemo;
use js_sys::Function;
use tf_demo_parser::demo::header::Header;
use tf_demo_parser::demo::parser::analyser::UserInfo;
use tf_demo_parser::demo::parser::gamestateanalyser::{GameStateAnalyser, World};
@ -103,8 +104,9 @@ impl FlatState {
}
#[wasm_bindgen]
pub fn parse_demo(buffer: Box<[u8]>) -> Result<FlatState, JsValue> {
let (parsed, world) = parse_demo_inner(&buffer).map_err(|e| JsValue::from(e.to_string()))?;
pub fn parse_demo(buffer: Box<[u8]>, progress: &Function) -> Result<FlatState, JsValue> {
let (parsed, world) =
parse_demo_inner(&buffer, progress).map_err(|e| JsValue::from(e.to_string()))?;
let world = world.ok_or_else(|| JsValue::from_str("No world defined in demo"))?;
@ -166,11 +168,16 @@ pub fn get_player_steam_id(state: &FlatState, player_id: usize) -> String {
state.player_info[player_id].steam_id.clone()
}
pub fn parse_demo_inner(buffer: &[u8]) -> Result<(ParsedDemo, Option<World>), ParseError> {
pub fn parse_demo_inner(
buffer: &[u8],
progress: &Function,
) -> Result<(ParsedDemo, Option<World>), ParseError> {
let demo = Demo::new(buffer);
let parser = DemoParser::new_with_analyser(demo.get_stream(), GameStateAnalyser::default());
let (header, mut ticker) = parser.ticker()?;
let total_ticks = header.ticks;
let mut last_progress = 0.0;
let mut parsed_demo = ParsedDemo::new(header);
@ -181,6 +188,11 @@ pub fn parse_demo_inner(buffer: &[u8]) -> Result<(ParsedDemo, Option<World>), Pa
parsed_demo.push_state(ticker.state());
}
skip = !skip;
let new_progress = ((ticker.state().tick as f32 / total_ticks as f32) * 100.0).floor();
if new_progress > last_progress {
last_progress = new_progress;
let _ = progress.call1(&JsValue::null(), &last_progress.into());
}
}
let state = ticker.into_state();