Initial work on wasm scripting backend
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
use std::convert::TryFrom;
|
||||
use std::fmt::Debug;
|
||||
use std::fs::File;
|
||||
use std::io::Read;
|
||||
use std::io::{BufReader, Read};
|
||||
|
||||
use hashbrown::HashSet;
|
||||
use num_traits::PrimInt;
|
||||
@@ -13,6 +13,7 @@ use pkmn_lib::dynamic_data::Gen7BattleStatCalculator;
|
||||
use pkmn_lib::dynamic_data::Gen7DamageLibrary;
|
||||
use pkmn_lib::dynamic_data::Gen7MiscLibrary;
|
||||
use pkmn_lib::dynamic_data::{DynamicLibrary, EmptyScriptResolver};
|
||||
use pkmn_lib::script_implementations::wasm::script_resolver::WebAssemblyScriptResolver;
|
||||
use pkmn_lib::static_data::{
|
||||
Ability, AbilityLibrary, BattleItemCategory, DataLibrary, EffectParameter, Form, GrowthRateLibrary, Item,
|
||||
ItemLibrary, LearnableMoves, LibrarySettings, LookupGrowthRate, MoveData, MoveLibrary, Nature, NatureLibrary,
|
||||
@@ -32,12 +33,15 @@ pub fn load_library() -> DynamicLibrary {
|
||||
load_abilities(&path, data.abilities_mut());
|
||||
load_moves(&path, &mut data);
|
||||
load_species(&path, &mut data);
|
||||
let mut resolver = WebAssemblyScriptResolver::new();
|
||||
load_wasm(&path, &mut resolver);
|
||||
|
||||
let dynamic = DynamicLibrary::new(
|
||||
data,
|
||||
Box::new(Gen7BattleStatCalculator {}),
|
||||
Box::new(Gen7DamageLibrary::new(false)),
|
||||
Box::new(Gen7MiscLibrary::new()),
|
||||
Box::new(EmptyScriptResolver {}),
|
||||
Box::new(resolver),
|
||||
);
|
||||
dynamic
|
||||
}
|
||||
@@ -271,6 +275,14 @@ pub fn load_species(path: &String, library: &mut StaticData) {
|
||||
}
|
||||
}
|
||||
|
||||
fn load_wasm(path: &String, library: &mut WebAssemblyScriptResolver) {
|
||||
let mut file = File::open(path.to_string() + "gen7_scripts_rs.wasm").unwrap();
|
||||
let mut reader = BufReader::new(file);
|
||||
let mut buffer = Vec::new();
|
||||
reader.read_to_end(&mut buffer);
|
||||
library.load_wasm_from_bytes(&buffer);
|
||||
}
|
||||
|
||||
fn parse_form(name: StringKey, value: &Value, library: &mut StaticData) -> Form {
|
||||
let mut abilities = Vec::new();
|
||||
for a in value["abilities"].as_array().unwrap() {
|
||||
|
||||
BIN
tests/data/gen7_scripts_rs.wasm
Executable file
BIN
tests/data/gen7_scripts_rs.wasm
Executable file
Binary file not shown.
@@ -4,27 +4,35 @@
|
||||
|
||||
use std::fs::File;
|
||||
use std::io::Read;
|
||||
use std::lazy::SyncLazy;
|
||||
use std::path::Path;
|
||||
|
||||
use pkmn_lib::dynamic_data::DynamicLibrary;
|
||||
use conquer_once::OnceCell;
|
||||
|
||||
use pkmn_lib::dynamic_data::{DynamicLibrary, ScriptCategory};
|
||||
|
||||
use crate::common::{library_loader, TestCase};
|
||||
|
||||
pub mod common;
|
||||
|
||||
static LIBRARY: SyncLazy<DynamicLibrary> = SyncLazy::new(|| {
|
||||
let start_time = chrono::Utc::now();
|
||||
let lib = library_loader::load_library();
|
||||
let end_time = chrono::Utc::now();
|
||||
println!("Built library in {} ms", (end_time - start_time).num_milliseconds());
|
||||
lib
|
||||
});
|
||||
static LIBRARY: OnceCell<DynamicLibrary> = OnceCell::uninit();
|
||||
|
||||
fn get_library<'a>() -> &'a DynamicLibrary {
|
||||
LIBRARY.get_or_init(|| {
|
||||
let start_time = chrono::Utc::now();
|
||||
let lib = library_loader::load_library();
|
||||
let end_time = chrono::Utc::now();
|
||||
println!("Built library in {} ms", (end_time - start_time).num_milliseconds());
|
||||
lib
|
||||
})
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[cfg_attr(miri, ignore)]
|
||||
fn validate_library_load() {
|
||||
SyncLazy::force(&LIBRARY);
|
||||
let start_time = chrono::Utc::now();
|
||||
let lib = library_loader::load_library();
|
||||
let end_time = chrono::Utc::now();
|
||||
println!("Built library in {} ms", (end_time - start_time).num_milliseconds());
|
||||
}
|
||||
|
||||
#[datatest::files("tests/test_cases", {
|
||||
@@ -37,5 +45,16 @@ fn integration_tests(input: &Path) {
|
||||
file.read_to_string(&mut str).unwrap();
|
||||
let test_case = serde_yaml::from_str::<TestCase>(&*str).unwrap();
|
||||
println!("\tRunning integration test {}", test_case.name);
|
||||
test_case.run_test(&LIBRARY);
|
||||
test_case.run_test(get_library());
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[cfg_attr(miri, ignore)]
|
||||
fn validate_script() {
|
||||
let lib = library_loader::load_library();
|
||||
let script = lib
|
||||
.load_script(0 as *const u8, ScriptCategory::Move, &"test".into())
|
||||
.unwrap()
|
||||
.unwrap();
|
||||
script.on_initialize(&[]);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user