mirror of
https://github.com/lifegpc/msg-tool.git
synced 2026-06-07 13:28:47 +08:00
Add import support for escude script
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
@@ -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<()> {
|
||||
|
||||
@@ -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(())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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};
|
||||
|
||||
@@ -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(())
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user