Add import support for escude script

This commit is contained in:
2025-06-03 19:40:04 +08:00
parent 833be4fce0
commit 09d850256f
7 changed files with 57 additions and 19 deletions

View File

@@ -100,7 +100,7 @@ pub trait Script: std::fmt::Debug {
fn import_messages(
&self,
_messages: Vec<Message>,
_filename: &str,
_file: Box<dyn WriteSeek>,
_encoding: Encoding,
_replacement: Option<&ReplacementTable>,
) -> Result<()> {
@@ -112,6 +112,18 @@ pub trait Script: std::fmt::Debug {
Ok(())
}
fn import_messages_filename(
&self,
_messages: Vec<Message>,
_filename: &str,
_encoding: Encoding,
_replacement: Option<&ReplacementTable>,
) -> Result<()> {
let f = std::fs::File::create(_filename)?;
let f = std::io::BufWriter::new(f);
self.import_messages(_messages, Box::new(f), _encoding, _replacement)
}
fn custom_export(&self, _filename: &std::path::Path, _encoding: Encoding) -> Result<()> {
Err(anyhow::anyhow!(
"This script type does not support custom export."
@@ -138,6 +150,7 @@ pub trait Script: std::fmt::Debug {
output_encoding: Encoding,
) -> Result<()> {
let f = std::fs::File::create(filename)?;
let f = std::io::BufWriter::new(f);
self.custom_import(custom_filename, Box::new(f), encoding, output_encoding)
}

View File

@@ -144,7 +144,7 @@ impl Script for BGIScript {
fn import_messages(
&self,
_messages: Vec<Message>,
_filename: &str,
_filename: Box<dyn WriteSeek>,
_encoding: Encoding,
_replacement: Option<&ReplacementTable>,
) -> Result<()> {

View File

@@ -224,7 +224,7 @@ impl Script for CircusMesScript {
fn import_messages(
&self,
messages: Vec<Message>,
filename: &str,
mut writer: Box<dyn WriteSeek>,
encoding: Encoding,
replacement: Option<&ReplacementTable>,
) -> Result<()> {
@@ -365,8 +365,7 @@ impl Script for CircusMesScript {
);
buffer.extend_from_slice(&self.data[self.asm_bin_offset + token.offset..len]);
}
let mut f = crate::utils::files::write_file(filename)?;
f.write_all(&buffer)?;
writer.write_all(&buffer)?;
Ok(())
}
}

View File

@@ -1,8 +1,8 @@
use crate::ext::io::*;
use crate::scripts::base::*;
use crate::types::*;
use crate::utils::encoding::encode_string;
use crate::utils::encoding::{decode_to_string, encode_string};
use crate::utils::struct_pack::*;
use crate::{ext::io::*, utils::encoding::decode_to_string};
use anyhow::Result;
use msg_tool_macro::*;
use serde::{Deserialize, Serialize};

View File

@@ -2,8 +2,10 @@ use crate::ext::io::*;
use crate::scripts::base::*;
use crate::types::*;
use crate::utils::encoding::{decode_to_string, encode_string};
use crate::utils::struct_pack::StructPack;
use anyhow::Result;
use std::collections::HashMap;
use std::ffi::CString;
use std::io::Read;
use unicode_segmentation::UnicodeSegmentation;
@@ -50,7 +52,6 @@ impl ScriptBuilder for EscudeBinScriptBuilder {
#[derive(Debug)]
pub struct EscudeBinScript {
offsets: Vec<u32>,
vms: Vec<u8>,
unk1: u32,
strings: Vec<String>,
@@ -91,12 +92,7 @@ impl EscudeBinScript {
strings.push(decode_to_string(encoding, s.as_bytes())?);
}
}
Ok(EscudeBinScript {
offsets,
vms,
unk1,
strings,
})
Ok(EscudeBinScript { vms, unk1, strings })
}
}
@@ -122,11 +118,35 @@ impl Script for EscudeBinScript {
fn import_messages(
&self,
_messages: Vec<Message>,
_filename: &str,
_encoding: Encoding,
_replacement: Option<&ReplacementTable>,
messages: Vec<Message>,
mut writer: Box<dyn WriteSeek>,
encoding: Encoding,
replacement: Option<&ReplacementTable>,
) -> Result<()> {
writer.write_all(b"ESCR1_00")?;
let mut offsets = Vec::with_capacity(messages.len());
let mut strs = Vec::with_capacity(messages.len());
let mut len = 0;
for message in messages {
offsets.push(len);
let mut s = message.message;
if let Some(repl) = replacement {
for (from, to) in &repl.map {
s = s.replace(from, to);
}
}
let encoded = encode_string(encoding, &s, true)?;
len += encoded.len() as u32 + 1;
strs.push(CString::new(encoded)?);
}
writer.write_u32(offsets.len() as u32)?;
offsets.pack(&mut writer, false, encoding)?;
writer.write_u32(self.vms.len() as u32)?;
writer.write_all(&self.vms)?;
writer.write_u32(self.unk1)?;
for s in strs {
writer.write_all(s.as_bytes_with_nul())?;
}
Ok(())
}