From 2da8e6ad03453d703058f009ecb9042192c9d0d6 Mon Sep 17 00:00:00 2001 From: wetor Date: Wed, 5 Jun 2024 20:59:34 +0800 Subject: [PATCH] =?UTF-8?q?[FIX]=20=E4=BF=AE=E5=A4=8D=E8=A1=A8=E8=BE=BE?= =?UTF-8?q?=E5=BC=8F=E7=BB=93=E6=9D=9F=E5=88=A4=E6=96=AD;=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E6=97=A0=E6=96=87=E6=9C=AC=E7=9A=84=E8=84=9A=E6=9C=AC?= =?UTF-8?q?=E8=A7=A3=E6=9E=90=E9=97=AE=E9=A2=98;=20=E4=BF=AE=E5=A4=8Dwindo?= =?UTF-8?q?ws=E4=B8=8B=E5=AF=BC=E5=87=BA=E6=96=87=E4=BB=B6=E5=A4=B9?= =?UTF-8?q?=E6=97=A0=E5=86=99=E5=85=A5=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/release.yml | 2 +- README.md | 6 ++++ main.go | 13 ++++---- script/format/NpcsFormat.go | 41 ++++++++++++++--------- script/format/NpcsPFormat.go | 41 ++++++++++++++--------- script/sc3.go | 6 +++- script/script.go | 62 ++++++++++++++++++++--------------- 7 files changed, 106 insertions(+), 65 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 22a21b1..67543b8 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -25,4 +25,4 @@ jobs: with: artifacts: "MagesTools_linux,MagesTools_mac,MagesTools_win.exe" bodyFile: "" - token: ${{ secrets.RELEASE_GITHUB_TOKEN }} + token: ${{ secrets.GITHUB_TOKEN }} diff --git a/README.md b/README.md index a08bbd0..0b1a1cc 100644 --- a/README.md +++ b/README.md @@ -124,6 +124,12 @@ MagesTools -type=diff \ ## 更新日志 +### 2024.6.5 +- 修复表达式结束判断 +- 复无文本的脚本解析问题 +- 修复windows下导出文件夹无写入问题 +- (以上问题由 [Fluchw](https://github.com/wetor/MagesTools/issues/5) 发现) + ### 2022.10.21 - 修复':'字符后为字节数据(`:[0xFF]`)导致Encode错误的问题 ([kurikomoe](https://github.com/kurikomoe)发现) diff --git a/main.go b/main.go index 41ad3e7..1bceb4b 100644 --- a/main.go +++ b/main.go @@ -1,20 +1,21 @@ package main import ( + "flag" + "fmt" + "path/filepath" + "strings" + "MagesTools/script" "MagesTools/script/format" "MagesTools/script/utils" - "flag" - "fmt" "github.com/go-restruct/restruct" - "path" - "strings" ) func main() { fmt.Print(`MagesTools -Version: 0.2.2_2022.10.21 +Version: 0.2.3_2024.06.05 Author: WéΤοr (wetorx@qq.com) Github: https://github.com/wetor/MagesTools License: GPL-3.0 @@ -102,7 +103,7 @@ License: GPL-3.0 scr.Open(file, _format) scr.Read() // 导出 - scr.SaveStrings(path.Join(pOutput, path.Base(file)+".txt")) + scr.SaveStrings(filepath.Join(pOutput, filepath.Base(file)+".txt")) } } else if utils.IsFile(pSource) && utils.IsFile(pOutput) { scr.Open(pSource, _format) diff --git a/script/format/NpcsFormat.go b/script/format/NpcsFormat.go index 3ed9b9b..9423f4c 100644 --- a/script/format/NpcsFormat.go +++ b/script/format/NpcsFormat.go @@ -1,10 +1,11 @@ package format import ( - "MagesTools/script/utils" "bytes" "fmt" "strings" + + "MagesTools/script/utils" ) type Npcs struct { @@ -91,20 +92,30 @@ func (f *Npcs) DecodeLine(data []byte) string { tmp := bytes.NewBuffer(nil) tmp.WriteByte(data[i]) i++ - for !(data[i] == 0 && data[i+1] == 0) { - switch data[i] & 0x60 { - case 0: //1 byte - tmp.WriteByte(data[i]) - i++ - case 0x20: //2 byte - tmp.Write(data[i : i+2]) - i += 2 - case 0x40: //3 byte - tmp.Write(data[i : i+3]) - i += 3 - case 0x60: // le int32 4 byte - tmp.Write(data[i : i+4]) - i += 4 + for { + //for !(data[i] == 0 && data[i+1] == 0) { + if (data[i] & 0x80) == 0x80 { + switch data[i] & 0x60 { + case 0: //1 byte + tmp.WriteByte(data[i]) + i++ + case 0x20: //2 byte + tmp.Write(data[i : i+2]) + i += 2 + case 0x40: //3 byte + tmp.Write(data[i : i+3]) + i += 3 + case 0x60: // le int32 4 byte + tmp.Write(data[i : i+4]) + i += 4 + } + } else { + if data[i] == 0 { + break + } else { + tmp.WriteByte(data[i]) + i++ + } } } tmp.WriteByte(data[i]) diff --git a/script/format/NpcsPFormat.go b/script/format/NpcsPFormat.go index d3fe739..353ec8a 100644 --- a/script/format/NpcsPFormat.go +++ b/script/format/NpcsPFormat.go @@ -1,10 +1,11 @@ package format import ( - "MagesTools/script/utils" "bytes" "fmt" "strings" + + "MagesTools/script/utils" ) type NpcsP struct { @@ -86,20 +87,30 @@ func (f *NpcsP) DecodeLine(data []byte) string { tmp := bytes.NewBuffer(nil) tmp.WriteByte(data[i]) i++ - for !(data[i] == 0 && data[i+1] == 0) { - switch data[i] & 0x60 { - case 0: //1 byte - tmp.WriteByte(data[i]) - i++ - case 0x20: //2 byte - tmp.Write(data[i : i+2]) - i += 2 - case 0x40: //3 byte - tmp.Write(data[i : i+3]) - i += 3 - case 0x60: // le int32 4 byte - tmp.Write(data[i : i+4]) - i += 4 + for { + //for !(data[i] == 0 && data[i+1] == 0) { + if (data[i] & 0x80) == 0x80 { + switch data[i] & 0x60 { + case 0: //1 byte + tmp.WriteByte(data[i]) + i++ + case 0x20: //2 byte + tmp.Write(data[i : i+2]) + i += 2 + case 0x40: //3 byte + tmp.Write(data[i : i+3]) + i += 3 + case 0x60: // le int32 4 byte + tmp.Write(data[i : i+4]) + i += 4 + } + } else { + if data[i] == 0 { + break + } else { + tmp.WriteByte(data[i]) + i++ + } } } tmp.WriteByte(data[i]) diff --git a/script/sc3.go b/script/sc3.go index 54c2293..e8e1c6f 100644 --- a/script/sc3.go +++ b/script/sc3.go @@ -1,10 +1,11 @@ package script import ( - "MagesTools/script/utils" "bytes" "encoding/binary" "fmt" + + "MagesTools/script/utils" "github.com/go-restruct/restruct" ) @@ -33,6 +34,9 @@ func (s *Sc3) ReadStrings(readString func([]byte) string) { panic(err) } s.Count = (s.OffsetEnd - s.OffsetStart) / 4 + if s.Count == 0 { + return + } s.Offsets = make([]Entry, s.Count) offset := s.OffsetStart for i := 0; i < s.Count; i++ { diff --git a/script/script.go b/script/script.go index 0db549b..fa9747f 100644 --- a/script/script.go +++ b/script/script.go @@ -1,11 +1,14 @@ package script import ( - "MagesTools/script/format" - "MagesTools/script/utils" "bufio" + "fmt" "io" "os" + "path/filepath" + + "MagesTools/script/format" + "MagesTools/script/utils" ) type Entry struct { @@ -38,6 +41,7 @@ type Strings interface { } type Script struct { + Name string Strings Strings Format format.Format DecodeCharset map[uint16]string @@ -45,10 +49,10 @@ type Script struct { } // NewScript -// Description 打开脚本文件 -// Param filename string -// Return *Script // +// Description 打开脚本文件 +// Param filename string +// Return *Script func NewScript(filename string, format format.Format) *Script { script := &Script{} script.Open(filename, format) @@ -56,17 +60,18 @@ func NewScript(filename string, format format.Format) *Script { } // Open -// Description 打开脚本文件,如果已经使用LoadCharset载入码表,则不需要重新调用LoadCharset -// Receiver s *Script -// Param filename string -// Param format format.Format // +// Description 打开脚本文件,如果已经使用LoadCharset载入码表,则不需要重新调用LoadCharset +// Receiver s *Script +// Param filename string +// Param format format.Format func (s *Script) Open(filename string, format format.Format) { f, err := os.Open(filename) if err != nil { panic(err) } defer f.Close() + s.Name = filepath.Base(filename) data, err := io.ReadAll(f) if err != nil { panic(err) @@ -83,12 +88,12 @@ func (s *Script) Open(filename string, format format.Format) { } // LoadCharset -// Description 载入码表/字符集 -// Receiver s *Script -// Param filename string 文件名 -// Param isTBL bool 是否为码表。否则为字符集,字符集从0x8000开始 -// Param skipExist bool 是否检查并跳过重复出现的字符,仅以第一次出现为准 // +// Description 载入码表/字符集 +// Receiver s *Script +// Param filename string 文件名 +// Param isTBL bool 是否为码表。否则为字符集,字符集从0x8000开始 +// Param skipExist bool 是否检查并跳过重复出现的字符,仅以第一次出现为准 func (s *Script) LoadCharset(filename string, isTBL, skipExist bool) { f, err := os.Open(filename) @@ -139,9 +144,9 @@ func (s *Script) LoadCharset(filename string, isTBL, skipExist bool) { } // Read -// Description 解析文本,需要至少执行一次script.LoadCharset载入码表 -// Receiver s *Script // +// Description 解析文本,需要至少执行一次script.LoadCharset载入码表 +// Receiver s *Script func (s *Script) Read() { if s.DecodeCharset != nil && s.EncodeCharset != nil { s.Format.SetCharset(s.DecodeCharset, s.EncodeCharset) @@ -150,25 +155,28 @@ func (s *Script) Read() { } // SaveStrings -// Description 保存文本,需要先执行script.Read -// Receiver s *Script -// Param filename string // +// Description 保存文本,需要先执行script.Read +// Receiver s *Script +// Param filename string func (s *Script) SaveStrings(filename string) { + strings := s.Strings.GetStrings() + if len(strings) == 0 { + fmt.Printf("文件 %s 无任何文本,跳过\n", s.Name) + return + } f, _ := os.Create(filename) defer f.Close() - - strings := s.Strings.GetStrings() for _, str := range strings { f.WriteString(str + "\n") } } // LoadStrings -// Description 载入文本并导入 -// Receiver s *Script -// Param filename string // +// Description 载入文本并导入 +// Receiver s *Script +// Param filename string func (s *Script) LoadStrings(filename string) { f, _ := os.Open(filename) defer f.Close() @@ -183,10 +191,10 @@ func (s *Script) LoadStrings(filename string) { } // Write -// Description 保存为脚本 -// Receiver s *Script -// Param filename string // +// Description 保存为脚本 +// Receiver s *Script +// Param filename string func (s *Script) Write(filename string) { s.Strings.WriteStrings(s.Format.EncodeLine)