WWAniXmlTweaks 0.3 (2019/04/28)
WickedWhimsのアニメーションを編集できる WWAniXmlTweaks 0.3 (2019/04/28) をアップロードしました。
この記事にリンクがあります。
https://picolet21.tumblr.com/post/183378481164/wwanixmltweaks
One Nice Bug Per Day
Claire Keane
macklin celebrini has autism
Monterey Bay Aquarium

gracie abrams

No title available

ellievsbear
official daine visual archive
let's talk about Bridgerton tea, my ask is open
occasionally subtle

No title available
Misplaced Lens Cap
sheepfilms

Origami Around
Sweet Seals For You, Always
Today's Document
noise dept.
2025 on Tumblr: Trends That Defined the Year
h

Game Changer & Make Some Noise

seen from Vietnam

seen from Malaysia
seen from United States
seen from United States
seen from Pakistan
seen from United States
seen from United States
seen from United States

seen from United States
seen from United States
seen from United States
seen from United States
seen from United States
seen from United Kingdom

seen from Bangladesh
seen from United States
seen from United States
seen from Germany

seen from United States
seen from United States
@picolet21-blog
WWAniXmlTweaks 0.3 (2019/04/28)
WickedWhimsのアニメーションを編集できる WWAniXmlTweaks 0.3 (2019/04/28) をアップロードしました。
この記事にリンクがあります。
https://picolet21.tumblr.com/post/183378481164/wwanixmltweaks
WWAniXmlTweaks
WickedWhims のアニメーション用XMLファイルの編集エディタを開発しました。まだちょっと動作が怪しいので、ベータ版ということにして下さい。
Download WWAniXmlTweaks 0.3 (2019/04/28)
・Packageファイルを直接編集できるようになりました。 ・アニメやアクター、エフェクトなどをコピペできるようになりました。 ・WWで使われていない旧タグを可能な限り盛り込みました。
Download WWAniXmlTweaks 0.2 (2019/03/19)
Download WWAniXmlTweaks 0.1 (2019/03/11)
Windows専用です。.Net framework 4.0が必要ですが、SIMS4が動作している人なら、特に何もなく動作すると思います。起動したら英語モードになっているので、OptionメニューのLanguageからJapaneseを選択して下さい。
特徴は以下の通りです。
ツリー表示形式
XMLファイルを生テキストではなくツリー形式で表示するため、編集項目が分かりやすくなっています。個々の項目には簡易的な説明も表示されます。
設定項目のリスト選択
カンマ区切りのリスト選択の項目については、リスト選択画面から候補を追加できるようにしました。なお、候補にないテキストは、Configフォルダ中の各種テキストデータを編集することで、好きなテキストを追加できるようになっています。
PackageファイルからのXML抽出
packageファイルをメニューから「開く」または、画面上にpackageをドラッグ&ドロップすることで、packageファイル中から直接的にXMLを抽出することができます。 ※但し、XMLをpackageに埋め込む機能は無いので、Sims4PackageEditorやS4Studioなどが必要です。
ツール機能による一括変換
ツール機能として表示名をリソース埋め込みからXMLでの直接設定するテキストに変換したり、再生秒数で設定されている値をアニメクリップの長さ換算から再生回数に変換したり、性別の一括変更などを搭載しています。
S4 STBL Merge 1.0.3
SIMS4のSTBL形式を編集するエディタである、S4 STBL Mergeを開発しました。
Download S4 STBL Merge 1.0.0 (2018.11.24) Download S4 STBL Merge 1.0.1 (2018.11.26)
・起動時のデバッグ用コードの削除を忘れていたので修正しました。 ・ファイル読み込み時のエラーチェックを強化しました。
Download S4 STBL Merge 1.0.2 (2018.11.26)
・ファイルメニューからpackageを開いたときのエラーを修正しました。
Download S4 STBL Merge 1.0.3 (2018.11.28)
・STBLだけのpackageで開けないものがあるのを修正しました。
Windows専用です。.Net framework 4.0が必要ですが、SIMS4が動作している人なら、特に何もなく動作すると思います。起動したら英語モードになっているので、OptionメニューのLanguageからJapaneseを選択して下さい。
特徴は以下の通りになっています。
原文と翻訳の表示
STBLを開いたとき、元の原文テキストと、入力した翻訳 テキスト を同時に開いて、XMLには原文と翻訳を同時に残せるようにしました。 これによって、翻訳したmodがバージョンアップしてテキストが追加されても、素早く未訳部分を特定することが出来ます。 なお、作成されるXMLはDP STBL Editorと互換性を保つようにしてあります。
翻訳過程の色分け表示
翻訳の段階を色分け表示できます。文章量の多いmodの場合、作業過程を保存することで時間を掛けて翻訳作業を行うことができます。 また、フィルタ機能により、未訳のものだけを表示とかも可能です。 ※このあたりの機能はFalloutやSkyrimのEPS翻訳ツールであるxTranslatorのレイアウトを参考にさせていただきました。
packageファイルからのSTBL抽出
packageファイルをメニューから「開く」または、画面上にpackageをドラッグ&ドロップすることで、packageファイル中から直接的にSTBLを抽出することができます。 このとき、内容のプレビューがXML形式で表示されます。
※但し、0xFFFFのタイプで圧縮されているSTBLの抽出は残念ながらできません。その場合はS4PEなどで抽出してから使用して下さい。
差分抽出機能
翻訳したいmodが過去に翻訳済みのパッケージを公開していた場合、双方の差分を取得できるようにしました。ツールの名称の「merege」たる由縁です。 翻訳したいmodのSTBLを開いた状態で、過去の翻訳済みのSTBLをドラッグ&ドロップをすると、「開く」か「比較読み込み」かを選択するダイアログが表示されますので、「 比較読み込み 」を選択するとインスタンスIDが一致するものを翻訳文として抽出します。※原文と翻訳の両方が保存されているxmlを比較読み込みした場合は、原文が一致する翻訳も読み込まれます。
タグのプレビュー表示機能
SIMS4のテキストには、単なるテキストではなく、{0:SimFirstName}のようにタグとなっているものがあります。画面下部の「プレビュー」をクリックすることで、仮の単語に置き換えて表示することで、タグの入力ミスが無いか確認することができます。
機械翻訳サポート
本ツールで機械翻訳できるわけではありませんが、ツールメニューの「翻訳」を選択すると、未訳の文章だけをHTML形式で出力できます。これをHTMLの機械翻訳をサポートしている別のツールに掛けて、得られたテキストを入力欄にペーストすると、インスタンスIDを元に翻訳文を抽出して反映できます。 現在のところ、生成されたtrans.htmlを Google Cromeに ドラッグ&ドロップした後、翻訳 された 訳文をCtrl+Aで全選択してからCtrl+Cを行い、本ツールのテキスト入力欄にCtrl+Vでペーストすることを想定しています。※Google Cromeは見えている部分しか翻訳しないため、一度スクロールして表示して下さい。
「翻訳」ボタンを押すと、未訳部分に翻訳が配置され、行の種別は「保留」として適用されます。
以上、使いやすさを考えて機能を実装しました。
まずは全文を機械翻訳に掛けてから、それを下訳として訳文をブラッシュアップすると楽になると思います。少なくとも1行ずつGoogle翻訳掛けるよりは、一括で出来るので楽だと思います。
翻訳の助けになると嬉しいです。
SIMS4のpackage形式の内部構造
STBLをそのまま読み込めるとなると、今度はpackageから直接STBLを読み込みたいという良くが出てきます。
それにはpackageの内部構造について知る必要があります。それにはDBPF形式についての知識が必要となります。というかDBPFはMaxisが採用しているデータ形式で、SIMS4以外にも、SimCityとかにも採用されている形式で、SIMS4のpackageも同様です。 詳細についてはSimCity4Encyclopadiaを読めばだいたい理解できるでしょう。
簡単に説明すると、先頭にヘッダにDBPFであることも識別と、登録されている個々のデータの個数と、データリストの絶対位置が入っているので、そこからファイルの絶対位置までジャンプして、インデックスデータリストを全件読み込むことになります。
Sims 4 Package Editorでpackageを開いてみた人は知っていると思いますが、Typeの値が0x220557DAであるものがSTBLの個々のデータであることが分かります。
ちなみに、それぞれのType値が何であるかのリストについては、こちらのSims 4 Packed File Typesが参考になると思います。
なお、インデックスからデータを取り出したい場合は、こちらのSims 3:DBPF The Indexの方が分かりやすいと思います。こちらはSIMS3の情報ではありますが、ヘッダのバージョンが2.0ではなく、2.1になっているくらいしか違いはないようです。
以下に、packageを読み込んで、登録されているインデックスデータを取得するプログラム例を以下に示します。
インデックスデータの先頭には4バイトの 省略 フラグが入っています。これはほとんどの場合は0x0ですが、まれにSTBLのみのpackageの場合は0x1となっている場合があります。この場合、先頭のResourceTypeのみが有効で、以降のデータはResourceTypeが省略されて入っていないことを意味します。
なお、STBLのインデックスデータの場合はCompressedフラグが0x0000のときは無圧縮、0x5A42のときはzLib圧縮されている点です。実際にデータを取り出す場合はChunkoffsetにシークすれば取得できます。0xFFFFの場合は、また別の圧縮形式ですが、 Sims 3:DBPF/Compressionが参考になると思います。
Public Structure sPackItem Public ResourceType As UInt32 Public ResourceGroup As UInt32 Public InstanceHi As UInt32 Public InstanceLo As UInt32 Public Chunkoffset As UInt32 Public Filesize As UInt16 Public Unknown1 As UInt16 Public Memsize As UInt32 Public Compressed As UInt16 Public Unknown2 As UInt16 End Structure Public Shared Function FiletoList(file As String) As List(Of sPackItem) Dim list As New List(Of sPackItem) Using fi As New IO.FileStream(file, IO.FileMode.Open) Dim bin(255) As Byte fi.Read(bin, 0, 4) 'magic ;; "DBPF" Dim head As String = System.Text.Encoding.ASCII.GetString(bin, 0, 4) If head <> "DBPF" Then Throw New ApplicationException("No DBPF file") fi.Read(bin, 0, 4) 'major ;; 2 If bin(0) <> 2 Then Throw New ApplicationException("No DBPF file") fi.Read(bin, 0, 4) 'minor ;; 1 If bin(0) <> 1 Then Throw New ApplicationException("No DBPF file") fi.Read(bin, 0, 24) 'unknown1 fi.Read(bin, 0, 4) 'インデックスエントリの数 - ゼロ、サイズ、および位置もゼロの場合 Dim indexEntries As UInt32 = BitConverter.ToUInt32(bin, 0) fi.Read(bin, 0, 4) 'unknown2 fi.Read(bin, 0, 4) 'ディスク上のインデックスのサイズ(バイト単位) Dim size As UInt32 = BitConverter.ToUInt32(bin, 0) fi.Read(bin, 0, 12) 'unknown3 fi.Read(bin, 0, 4) 'インデックスバージョン ;; 常に3 If bin(0) <> 3 Then Throw New ApplicationException("No DBPF file") fi.Read(bin, 0, 4) 'インデックスの位置(絶対) Dim indexPosition As UInt32 = BitConverter.ToUInt32(bin, 0) fi.Read(bin, 0, 28) 'unknown4 fi.Seek(indexPosition, IO.SeekOrigin.Begin) 'インデックス位置へ fi.Read(bin, 0, 4) ‘インデックスデータ省略フラグ Dim IndexType As UInt32 = BitConverter.ToUInt32(bin, 0) Dim first As sPackItem = Nothing For i As Integer = 0 To indexEntries - 1 Dim item As New sPackItem '0:ResourceType If i = 0 OrElse (IndexType And &H1) = 0 Then fi.Read(bin, 0, 4) item.ResourceType = BitConverter.ToUInt32(bin, 0) Else item.ResourceType = first.ResourceType End If '1:ResourceGroup If i = 0 OrElse (IndexType And &H2) = 0 Then fi.Read(bin, 0, 4) item.ResourceGroup = BitConverter.ToUInt32(bin, 0) Else item.ResourceGroup = first.ResourceGroup End If '2:InstanceHi If i = 0 OrElse (IndexType And &H4) = 0 Then fi.Read(bin, 0, 4) item.InstanceHi = BitConverter.ToUInt32(bin, 0) Else item.InstanceHi = first.InstanceHi End If '3:InstanceLo If i = 0 OrElse (IndexType And &H8) = 0 Then fi.Read(bin, 0, 4) item.InstanceLo = BitConverter.ToUInt32(bin, 0) Else item.InstanceLo = first.InstanceLo End If '4:Chunkoffset If i = 0 OrElse (IndexType And &H10) = 0 Then fi.Read(bin, 0, 4) item.Chunkoffset = BitConverter.ToUInt32(bin, 0) Else item.Chunkoffset = first.Chunkoffset End If '5:Filesize and Unknown1 If i = 0 OrElse (IndexType And &H20) = 0 Then fi.Read(bin, 0, 4) item.Filesize = BitConverter.ToUInt16(bin, 0) item.Unknown1 = BitConverter.ToUInt16(bin, 3) Else item.Filesize = first.Filesize item.Unknown1 = first.Unknown1 End If '6:Memsize If i = 0 OrElse (IndexType And &H40) = 0 Then fi.Read(bin, 0, 4) item.Memsize = BitConverter.ToUInt32(bin, 0) Else item.Memsize = first.Memsize End If '7:Compressed and Unknown2 If i = 0 OrElse (IndexType And &H80) = 0 Then fi.Read(bin, 0, 4) item.Compressed = BitConverter.ToUInt16(bin, 0) item.Unknown2 = BitConverter.ToUInt16(bin, 3) Else item.Compressed = first.Compressed item.Unknown2 = first.Unknown2 End If list.Add(item) If i = 0 Then first = item Next End Using Return list End Function
SIMS4のSTBL形式からの抽出実例
先だって記述した手順で実際にSTBLからテキストデータを抽出できました。とくに難しい内容でもないですが、実例をソースコードの形で残しておきます。
この例では、ByteCountの値を使っていませんが、実際にはこの値を元に内部のバイト領域の確保したりすることになります。値自体は全てのテキストバイト長+1を合計したものになります。何に使うか不明なByte unknownの数も計算に入っているのが注意点です。
なお、C#形式ではなくVB.NET形式なのはご勘弁を。
Public Structure s4item Public InstanceID As UInt32 Public TextString As String End Structure Public Shared Function STBLtoList(file As String) As Dictionary(Of UInt32, s4item) Dim list As New Dictionary(Of UInt32, s4item) Using fi As New System.IO.FileStream(file, System.IO.FileMode.Open) Dim bin(255) As Byte fi.Read(bin, 0, 4) 'DWORD "STBL" Dim head As String = System.Text.Encoding.ASCII.GetString(bin, 0, 4) If head <> "STBL" Then Throw New ApplicationException("Not STBL file") fi.Read(bin, 0, 1) 'Byte version (5) If bin(0) <> 5 Then Throw New ApplicationException("Not STBL file") fi.Read(bin, 0, 2) 'WORD null fi.Read(bin, 0, 4) 'DWORD count Dim count As UInt32 = System.BitConverter.ToUInt32(bin, 0) fi.Read(bin, 0, 6) 'WORD null fi.Read(bin, 0, 4) 'DWORD ByteCount Dim ByteCount As UInt32 = System.BitConverter.ToUInt32(bin, 0) For i As UInt32 = 0 To count - 1 fi.Read(bin, 0, 4) 'DWORD id Dim id As UInt32 = System.BitConverter.ToUInt32(bin, 0) fi.Read(bin, 0, 1) 'Byte unknown fi.Read(bin, 0, 2) 'WORD length Dim length As UInt32 = System.BitConverter.ToUInt16(bin, 0) Dim unicodeLE(length - 1) As Byte fi.Read(unicodeLE, 0, length) 'strings are UTF8 Dim text As String = System.Text.Encoding.UTF8.GetString(unicodeLE, 0, length) If list.ContainsKey(id) Then Continue For 'Overlap Dim item As New s4item item.InstanceID = id item.TextString = text list.Add(item.InstanceID, item) Next End Using Return list End Function
SIMS4の翻訳ツールとSTBL形式
SIMS4の海外MODを翻訳する際には、Sims 4 Package Editorで内部テキストタをSTBL形式で抽出して、TS4 STBL Editorまたは、DP STBL Editorを使用して編集することになります。
この二つは一長一短があって、短所のみを上げると以下のようになります。
TS4 STBL Editor
・IDの重複を検出せずに、単純に読み込み順に行として表示してしまう。 ・各行の高さを自動計算するが速度は遅いため、ちょっと長い文章を編集しようとすると再描画待ちが発生してストレスが出る。 ・IDが重複している場合にxmlをインポートすると、重複行が適用されずに原文のままになる。
DP STBL Editor
・内部でIDの重複を許さないので、重複のあるデータを読み込もうとするとエディタがクラッシュする。 ・ ダイアログ のウィンドウ枠が固定になっていて、日本語環境ではボタンがダイアログからはみ出していて、見えないし、押せない。
TS4 STBL Editorは操作性が悪く、XMLとのやり取りに問題があり、DP STBL Editorはクラッシュ問題があるので使えない。どっちもIDが重複しているなら、読み飛ばししてくれれば問題解決なのに...。
仕方がないので、STBLから重複を削除するプログラムを作ってみるかと、STBL形式の内部構造についての解説を探したところ、以下の情報を見つけました。
こちらの サイトより転載
DWORD // 'STBL' BYTE // バージョン(5) BYTE[2] // null DWORD count // テキストのカウント BYTE[6] // null DWORD ByteCount // テキストデータの総バイト数 (lengthは除く) --繰り返し ''count'': DWORD id // インスタンスID Byte unknown // null? WORD length // テキストのデータ長 unicodeLE // UTF8形式のテキストバイナリ
要するに単純にIDとUTF-8テキストのバイナリが並んでいるだけ。
これなら重複を削除したり、STBLからテキストをそのまま抽出するのも簡単ですね。ということでツール作成を開始するのでした。