Initial work on wasm scripting backend

This commit is contained in:
2022-07-18 10:16:47 +02:00
parent 8eb1159d64
commit 7682704945
21 changed files with 651 additions and 31 deletions

View File

@@ -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

Binary file not shown.

View File

@@ -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(&[]);
}