mirror of
https://github.com/lifegpc/msg-tool.git
synced 2026-07-08 01:31:53 +08:00
Compare commits
2 Commits
4c16c68921
...
v0.2.10
| Author | SHA1 | Date | |
|---|---|---|---|
| 9569be0301 | |||
| f99a15090f |
2
Cargo.lock
generated
2
Cargo.lock
generated
@@ -1329,7 +1329,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "msg_tool"
|
name = "msg_tool"
|
||||||
version = "0.2.9"
|
version = "0.2.10"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"adler",
|
"adler",
|
||||||
"anyhow",
|
"anyhow",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "msg_tool"
|
name = "msg_tool"
|
||||||
version = "0.2.9"
|
version = "0.2.10"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
repository = "https://github.com/lifegpc/msg-tool"
|
repository = "https://github.com/lifegpc/msg-tool"
|
||||||
description = "A command-line tool for exporting, importing, packing, and unpacking script files."
|
description = "A command-line tool for exporting, importing, packing, and unpacking script files."
|
||||||
|
|||||||
@@ -242,6 +242,7 @@ impl Script for CstScript {
|
|||||||
let mut mes = mess.next();
|
let mut mes = mess.next();
|
||||||
let strings_address_offset = 0x10 + self.data.cpeek_u32_at(0x8)? as usize;
|
let strings_address_offset = 0x10 + self.data.cpeek_u32_at(0x8)? as usize;
|
||||||
let strings_offset = 0x10 + self.data.cpeek_u32_at(0xC)? as usize;
|
let strings_offset = 0x10 + self.data.cpeek_u32_at(0xC)? as usize;
|
||||||
|
let mut name_index = None;
|
||||||
for (i, s) in self.strings.iter().enumerate() {
|
for (i, s) in self.strings.iter().enumerate() {
|
||||||
match s.typ {
|
match s.typ {
|
||||||
CstStringType::Message => {
|
CstStringType::Message => {
|
||||||
@@ -254,6 +255,28 @@ impl Script for CstScript {
|
|||||||
return Err(anyhow::anyhow!("No enough messages."));
|
return Err(anyhow::anyhow!("No enough messages."));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
if let Some(name_idx) = name_index.take() {
|
||||||
|
let mut name = match &m.name {
|
||||||
|
Some(n) => n.clone(),
|
||||||
|
None => {
|
||||||
|
return Err(anyhow::anyhow!("Message has no name.",));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
if let Some(replacement) = replacement {
|
||||||
|
for (k, v) in &replacement.map {
|
||||||
|
name = name.replace(k, v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let data = encode_string(encoding, &name, true)?;
|
||||||
|
let s = &self.strings[name_idx];
|
||||||
|
let pos = writer.write_patched_string(s, &data)?;
|
||||||
|
if pos != s.address {
|
||||||
|
writer.write_u32_at(
|
||||||
|
strings_address_offset as u64 + name_idx as u64 * 4,
|
||||||
|
(pos - strings_offset) as u32,
|
||||||
|
)?;
|
||||||
|
}
|
||||||
|
}
|
||||||
let mut message = m.message.clone();
|
let mut message = m.message.clone();
|
||||||
if let Some(replacement) = replacement {
|
if let Some(replacement) = replacement {
|
||||||
for (k, v) in &replacement.map {
|
for (k, v) in &replacement.map {
|
||||||
@@ -272,29 +295,7 @@ impl Script for CstScript {
|
|||||||
mes = mess.next();
|
mes = mess.next();
|
||||||
}
|
}
|
||||||
CstStringType::Character => {
|
CstStringType::Character => {
|
||||||
let m = match mes {
|
name_index = Some(i);
|
||||||
Some(m) => m,
|
|
||||||
None => {
|
|
||||||
return Err(anyhow::anyhow!("No enough messages."));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
let mut name = match &m.name {
|
|
||||||
Some(name) => name.to_owned(),
|
|
||||||
None => return Err(anyhow::anyhow!("Message without name.")),
|
|
||||||
};
|
|
||||||
if let Some(replacement) = replacement {
|
|
||||||
for (k, v) in &replacement.map {
|
|
||||||
name = name.replace(k, v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
let data = encode_string(encoding, &name, true)?;
|
|
||||||
let pos = writer.write_patched_string(s, &data)?;
|
|
||||||
if pos != s.address {
|
|
||||||
writer.write_u32_at(
|
|
||||||
strings_address_offset as u64 + i as u64 * 4,
|
|
||||||
(pos - strings_offset) as u32,
|
|
||||||
)?;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
CstStringType::Command => {
|
CstStringType::Command => {
|
||||||
if let Some(caps) = CST_COMMAND_REGEX.captures(&s.text)? {
|
if let Some(caps) = CST_COMMAND_REGEX.captures(&s.text)? {
|
||||||
|
|||||||
Reference in New Issue
Block a user