fork download
  1. ***** Wesnoth 1.12.6 で シナリオ開始時の文字列と シナリオ中の会話の文字列を取りだす方法調査 第1回目報告文書 ***
  2.  
  3. 2016/5/30
  4.  
  5.  
  6. // この文書のライセンスはWesnothやWesnoth本家配布のゲームWesnothのソースや文書と同じライセンスとします
  7. // ライセンスが複数ある場合より自由度の高いものに従うものとします
  8. // この文書による被害には一切責任を持ちません、この情報をもとにやるなら自己責任でお願いします。
  9. // それほど危険な情報じゃないけど自己防衛の為に書いとます
  10.  
  11.  
  12. **** 調べた環境
  13. Wesnoth のバージョンは 1.12.6
  14. Debian Linux Sid amd64 環境で以下の調査と検証を行ないました
  15. (この環境でのDebianでもwesnothパッケージのバージョンは 1:1.12.6-1 )
  16.  
  17.  
  18. **** 使ったツール
  19. GNU Global(ソースを調べるのに)
  20. GNU GDB (デバッガ)これが主役
  21. Nemiver (これもデバッガ 最初これ使ってたけど途中からGDBにした)
  22.  
  23.  
  24. *** 調査の目的
  25. シナリオ開始時の英文と、シナリオプレイ中の台詞をテキストデータとして取りだす
  26. それをChronium
  27.  
  28.  
  29. *** 調査の経緯
  30. これは省略
  31. ソースを真面目に読まずに適当にやったためまわりみちしました
  32. なので省略
  33.  
  34.  
  35. *** 上手くいった調査方法
  36. まず wesnothのデバッグ情報を含んだパッケージ wesnoth-1.12-dbg を 以下のコマンドでインストール
  37.  
  38. sudo aptitude install wesnoth-1.12-dbg
  39.  
  40. ソースも必要みたいだったので
  41.  
  42. /build/wesnoth-1.12-65cmTO
  43.  
  44. を作成して(このディレクトリはデバッガがソースないって文句いってきたディレクトリ)
  45.  
  46. そこで
  47.  
  48. apt-get source wesnoth
  49.  
  50. としてソースをダウンロード
  51.  
  52.  
  53. *** 最初はGNU Golobalでソース調べてたので
  54.  
  55. cd wesnoth-1.12-1.12.6/src/
  56. htags -gansx
  57.  
  58. としてソースを調べやすくするHTMLファイルも生成した
  59.  
  60.  
  61. *** 上手くいった調査方法
  62.  
  63. まずWesnothを立ちあげてから
  64. 調べたいメッセージ表示中に
  65. gdb等のデバッガでattachして
  66. btをかけたりソースを調べて
  67. それらしい文字列が含まれてそうな変数やクラスを
  68. 表示して見つけて
  69. ブレイクポイントとして適切そうなものを調べた
  70.  
  71.  
  72. *** wesnoth を起動して gdbを起動した後に入れたコマンド
  73. 実際はもっと色々試行錯誤したけど
  74. それ書いても面白くもなんともないので
  75. 最終上手くいったものは
  76.  
  77. shell ps x | grep wesnoth
  78.  
  79. でattach すべき 実行してるwesnoth の pid を調べます
  80.  
  81. attach 調べたpid番号(22909みたいな数字)
  82.  
  83. その後
  84.  
  85. b storyscreen::part_ui::part_ui
  86. b gui2::show_wml_message
  87.  
  88. でブレイクポイントを指定しておきます
  89.  
  90. あとはそれぞれのブレイクポイントで停止してから
  91.  
  92. command 1
  93. p p->text_
  94. c
  95. end
  96.  
  97. を入力して
  98.  
  99. c
  100.  
  101. そして2番目のブレイクポイントで止まったら
  102.  
  103. command 2
  104. p message
  105. c
  106. end
  107.  
  108. を入力して
  109.  
  110. c
  111.  
  112. これで後は画面がいっぱいになったときに
  113. エンターを押すだけでgdbのターミナルにwesnothのシナリオ開始時のテキスト文と
  114. シナリオ中の会話文がテキストとして表示されます
  115.  
  116.  
  117.  
  118. *** 今後
  119. 入れるタイミングとかあるし
  120. gdbを起動した時にwesnothが起動してないなら
  121. 起動してpid調べるとかして
  122. 調べたpidでattachするとか面倒くさい作業が必要だったので
  123.  
  124. これを自動化するには
  125. 元のソースを改造して出力するようにするか
  126. あるいは gdbの操作自体を expect のような自動化ツールを使ってやれば可能となりました
  127.  
  128. パッチあてるにしても必要な箇所が上で調べれたので
  129. やるかやらんかわかりません
  130.  
  131. 文字列の取りだしには成功したっぽいので
  132. それが出来たらその文字列を自動翻訳にかけるなり
  133. マウスでかざしたら楽に辞書ひける環境で使えるようにするなり
  134. 好きにできるので
  135. また時間があったらやるかもしれません
  136.  
  137. ここまでで結構楽しかったし
  138. 当初の目的は達成されたので比較的満足してしまってる今日この頃
  139.  
  140.  
  141. *** パッチを作てくれる人向けの場所説明
  142.  
  143. gdb で info b
  144. として表示すると以下になってます
  145.  
  146. Num Type Disp Enb Address What
  147. 1 breakpoint keep y 0x0000000000dd0e90 in storyscreen::part_ui::part_ui(storyscreen::part&, display&, gui::button&, gui::button&, gui::button&) at /build/wesnoth-1.12-65cmTO/wesnoth-1.12-1.12.6/src/storyscreen/render.cpp:80
  148. 2 breakpoint keep y 0x0000000000c22220 in gui2::show_wml_message(bool, CVideo&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool, bool, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, unsigned int, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, int*) at /build/wesnoth-1.12-65cmTO/wesnoth-1.12-1.12.6/src/gui/dialogs/wml_message.cpp:175
  149.  
  150.  
  151. なので
  152.  
  153. storyscreen::part_ui::part_ui(storyscreen::part&, display&, gui::button&, gui::button&, gui::button&) at /build/wesnoth-1.12-65cmTO/wesnoth-1.12-1.12.6/src/storyscreen/render.cpp:80
  154.  
  155.  
  156.  
  157. gui2::show_wml_message(bool, CVideo&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool, bool, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, unsigned int, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, int*) at /build/wesnoth-1.12-65cmTO/wesnoth-1.12-1.12.6/src/gui/dialogs/wml_message.cpp:175
  158.  
  159. でなんとかすれば文字列をコピペする形で外に取りだすことは簡単だと思います
  160.  
  161. パッケージを改造するとバージョン上げるごとに
  162. パッチをあてるのが面倒なので
  163. 私はもうちょっとgdbと他のツールでなんとかする方向で頑張るかもしれません
  164.  
  165.  
  166. ***その他の改造について
  167. 上の方法で調べれば、勝利条件とかポップアップダイアログの
  168. 職種や人種のマニュアルの文字も取りだして自動飜訳するために
  169. ソースの何処をいじれば良いのか調べれると思います
  170.  
  171. 今回GDBをメインで調べてみた感じだと
  172. チートコード的なことをGDBで出来そう
  173. ソースを調べるにはGNU GLOBAL使って
  174. ヒットポイントが減って自分側なら
  175. 自動で増やすとか非確定簡単にできそう
  176. ソース公開されてる分
  177. クローズドソースのものよりずっとやりやすいし
  178.  
  179. 誰かやってくれる人がいることを期待しつつ
  180. この調査報告書を終ります
  181.  
  182. しばらくして誰もやってくれなくて
  183. 私がやる気になったら私がやるかも
  184. 得にGDBを利用した方はそれほど手間かけずに出来そうだし
  185.  
  186. つまり他の誰かがやってくれることを
  187. 非常に期待してます
  188.  
  189.  
  190. buynnnmmm1
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty