アルバトロスSP追加
training/* はライブラリではないので上に移動
VersusModが密結合状態→修正
練習データ更新

diff --git a/lib/vortex/basic_models.rb b/lib/vortex/basic_models.rb
index f7764e2..cfe3ca1 100644
--- a/lib/vortex/basic_models.rb
+++ b/lib/vortex/basic_models.rb
@@ -164,7 +164,7 @@ def initialize(width: Piece::Classic.piece_size_max, height: Piece::Classic.piec
   # 文字列からフィールドを作成する
   def import_from_str(str)
     lines = str.lines.collect{|str|str.strip}      # 前後の空白除去
-    lines = lines.collect{|str|str.sub(/;.*/, "")} # コメント除去
+    lines = lines.collect{|str|str.sub(/[;#].*/, "")} # コメント除去
     lines = lines.reject{|str|str.empty?}          # 空行除去
     lines.reverse_each.with_index do |str, i|    # 底から上に向かって読む
       str.chars.each.with_index do |ch, x|
diff --git a/training2/environment.rb b/training2/environment.rb
index c588032..38a15a6 100644
--- a/training2/environment.rb
+++ b/training2/environment.rb
@@ -8,6 +8,7 @@ class TrainingController < StandardController2
   def initialize
     super
     @start_delay = 10
+    # @das_delay   = 4     # 横溜め

     @level_info.line_clear_delay = 30 # 浮いたブロックが落るまで
     @level_info.lc_entry_delay   = 5  # ラインクリア時の次のブロックが移動可能になるまで
diff --git a/training2/main.rb b/training2/main.rb
index 66dcd90..846408b 100644
--- a/training2/main.rb
+++ b/training2/main.rb
@@ -3,12 +3,11 @@

 library = [
   {
-    :title      => "DT砲",
-    :controller => TrainingController.new,
+    :title       => "DT砲",
+    :controller  => TrainingController.new,
     :piece_class => Piece::World,
-    :randomizer => "LSTIJZO IOZSLJT T",
-    :field      => <<-EOS,
-  ..........
+    :randomizer  => "LSTIJZO IOZSLJT T",
+    :field       => <<-EOS,
   EOS
     :input => <<-EOS,
     *
@@ -26,34 +25,197 @@
     r| u *                 # S
     l A u *                # L
     B l| u *               # J
-    B l| d_ A . A d_ A u * # T
+    B l| d_ A . A d_ A u * # T (TSD)

-    B l| d_ A . A u *      # T
+    B l| d_ A . A u *      # T (TST)
+    EOS
+  },
+  {
+    :title       => "階段積み",
+    :controller  => TrainingController.new,
+    :piece_class => Piece::World,
+    :randomizer  => "SZT",
+    :field       => <<-EOS,
+xxxx......
+xxxxxxx...
+xxxxxxxx..
+xxxxxxxxx.
+xxxxxxxxx.
+xxxxxxxxx.
+xxxxxxxxx.
+  EOS
+    :input => <<-EOS,
+    *
+    r u *              # S
+    B r| u *           # Z
+    r| l d_ B d_ B u * # T (TSD)
+    EOS
+  },
+  {
+    :title       => "ワンツーパンチ",
+    :controller  => TrainingController.new,
+    :piece_class => Piece::World,
+    :randomizer  => "OLSIZJT T",
+    :field       => <<-EOS,
+  EOS
+    :input => <<-EOS,
+    *
+    u *                # O
+    l| r u *           # L
+    A u *              # S
+    r| u *             # I
+    r . r u *          # Z
+    A r| u *           # J
+    l| d_ B u *        # T (TSM)
+
+    l| r d_ A d_ A u * # T (TSD)
+    EOS
+  },
+  {
+    :title       => "STSD",
+    :controller  => TrainingController.new,
+    :piece_class => Piece::World,
+    :randomizer  => "LJTT",
+    :field       => <<-EOS,
+xxxxxx....
+xxxxxx....
+xxxxxxx...
+xxxxxxx...
+xxxxxxxx.x
+xxxxxxxx.x
+xxxxxxxx.x
+xxxxxxxx.x
+  EOS
+    :input => <<-EOS,
+    *
+    A r| u *         # L
+    Br . r u *       # J
+    Ar| d_ B . B u * # T (TSD)
+    r| d_ B d_ B u * # T (TSD)
+    EOS
+  },
+  {
+    :title       => "へぼまいスピン",
+    :controller  => TrainingController.new,
+    :piece_class => Piece::World,
+    :randomizer  => "ZOSILJT OZT",
+    :field       => <<-EOS,
+  EOS
+    :input => <<-EOS,
+    *
+    Al| u *    # Z
+    u *        # O
+    B u *      # S
+    r| u *     # I
+    Br . r u * # L
+    A r| u *   # J
+    Al d_ B u  # T
+
+    r| l u *   # O
+    Al| u *    # Z
+    Al d_ A u  # T
+    EOS
+  },
+  {
+    :title       => "アルバトロスSP",
+    :controller  => TrainingController.new,
+    :piece_class => Piece::World,
+    :randomizer  => "OLSIZJT JLSZOIT JSZILOT T",
+    :field       => <<-EOS,
+  EOS
+    :input => <<-EOS,
+    *
+    l u *            # O
+    Br . Br u *      # L
+    A l| u *         # S
+    B r| u *         # I
+    u *              # Z
+    Br| . Bl u *     # J
+    l| Ar d_ A u *   # T
+
+    Bl| u *          # J
+    Al u *           # L
+    Br u *           # S
+    B u *            # Z
+    r| l u *         # O
+    r| u *           # I
+    lB| d_ A . A u * # T
+
+    lB| d_ A u *     # J
+    lA u *           # S
+    B u *            # Z
+    rB u *           # I
+    r| lB u *        # L
+    r| u *           # O
+    lA| d_ A u *     # T
+
+    r| d_ A u *      # T
+
+    EOS
+  },
+  {
+    :title       => "QTK",
+    :controller  => TrainingController.new,
+    :piece_class => Piece::World,
+    :randomizer  => "ZOT",
+    :field       => <<-EOS,
+xxxxxxx...
+xxxxxxxx..
+xxxxxxxx..
+xxxxxxxx..
+xxxxxxxxx.
+xxxxxxxxx.
+xxxxxxxxx.
+xxxxxxxxx.
+  EOS
+    :input => <<-EOS,
+    *
+    r| B u *         # Z
+    r . r u *        # O
+    Br| d_ B u *     # T
+    EOS
+  },
+  {
+    :title       => "開幕TSD",
+    :controller  => TrainingController.new,
+    :piece_class => Piece::World,
+    :randomizer  => "ISJZOLT SZJLIOT",
+    :field       => <<-EOS,
+  EOS
+    :input => <<-EOS,
+    *
+    u *            # I
+    r u *          # S
+    Ar| u *        # J
+    Al u *         # Z
+    l| u *         # O
+    rB . B u *     # L
+    r| Bl d_ B u * # T
+
+    r u *          # S
+    rB| u *        # Z
+    l| u *         # J
+    l| r u *       # L
+    lA| u *        # I
+    l| r u *       # O
+    r| Bl d_ B u * # T
     EOS
   },
 ]

 if $0 == __FILE__
-  Simulator.start_auto(library[0])
-  Simulator.start_auto(library[0])
-  Simulator.start_auto(library[0])
-  Simulator.start_auto(library[0])
-  # Simulator.start(library[0]); exit
-
-  library.each{|e| break if Simulator.start_auto(e) == :break} # 13
-  exit
+  # Simulator.start_auto(e)
+  # Simulator.start_auto(library[0])
+  # Simulator.start_auto(library[0])
+  # Simulator.start_auto(library[0])
+  # Simulator.start_auto(library[0])
+  # Simulator.start_auto(library.last, fps: 60); exit
+  # Simulator.start(library[1]); exit
+  # library.reverse.each{|e| break if Simulator.start_auto(e) == :break} # 13
+  # exit
   if ARGV.empty?
-    Simulator.start_auto(library.reverse.find{|e|!e[:input].nil?}, 0)
+    Simulator.start_auto(library.last)
   else
-    Simulator.start(library.reverse.find{|e|!e[:input].nil?}, 0)
+    Simulator.start(library.last)
   end
-  # Simulator.start_auto(library[0],60)
 end
-
-library
-
-# loop do
-#   library[:randomizer] = "OJZILS".chars.shuffle.join + "T JIOZLST T"
-#   ret = Simulator.start(library, loop: 1)
-#   break if ret == :break
-# end
*Window → Windows::*

diff --git a/doc/gtk_memo.txt b/doc/gtk_memo.txt
index 4352f9e..a48086d 100644
--- a/doc/gtk_memo.txt
+++ b/doc/gtk_memo.txt
@@ -10,7 +10,7 @@ http://home2.highway.ne.jp/mutoh/tips/gtk_etc.html

 ** ダメな方法1

-  g = AnythingWindow.new(frame, 0, Draw.new)
+  g = Window::Anything.new(frame, 0, Draw.new)
   Thread.start{
     frame.start(0)
     g.close #=> Gtk.main_quit が呼ばれる。
@@ -23,7 +23,7 @@ http://home2.highway.ne.jp/mutoh/tips/gtk_etc.html

 ** 良い方法2

-  g = AnythingWindow.new(frame, 0, Draw.new)
+  g = Window::Anything.new(frame, 0, Draw.new)
   frame.start(0){
     while (Gtk.events_pending?)
       Gtk.main_iteration
diff --git a/examples/20G_world/10_20G.rb b/examples/20G_world/10_20G.rb
index b176c86..0c80524 100644
--- a/examples/20G_world/10_20G.rb
+++ b/examples/20G_world/10_20G.rb
@@ -1,4 +1,4 @@
 require_relative "environment"
 frame = Modes::FrameDeath.new
-AnythingWindow.new(frame)
+Window::Anything.new(frame)
 frame.start
diff --git a/examples/20G_world/20_IRS_training.rb b/examples/20G_world/20_IRS_training.rb
index aa1bce6..259f3ad 100644
--- a/examples/20G_world/20_IRS_training.rb
+++ b/examples/20G_world/20_IRS_training.rb
@@ -20,5 +20,5 @@ def initialize
 end

 frame = Modes::FrameMasterSingleIRS.new
-AnythingWindow.new(frame)
+Window::Anything.new(frame)
 frame.start
diff --git a/examples/20G_world/23_no_irs.rb b/examples/20G_world/23_no_irs.rb
index 7459301..e3d0476 100644
--- a/examples/20G_world/23_no_irs.rb
+++ b/examples/20G_world/23_no_irs.rb
@@ -1,4 +1,4 @@
 require_relative 'environment'
 frame = Modes::FrameMaster20GNoIRS.new
-AnythingWindow.new(frame)
+Window::Anything.new(frame)
 frame.start
diff --git a/examples/test_play.rb b/examples/test_play.rb
index 3f61c8d..a54f1a3 100644
--- a/examples/test_play.rb
+++ b/examples/test_play.rb
@@ -6,5 +6,5 @@
   WavePlayer.new(player.controller)
   MusicPlayer.new(player.controller)
 }
-AnythingWindow.new(frame)
+Window::Anything.new(frame)
 frame.start
diff --git a/lib/vortex/input/input_base.rb b/lib/vortex/input/input_base.rb
index c784b2a..d3f108c 100644
--- a/lib/vortex/input/input_base.rb
+++ b/lib/vortex/input/input_base.rb
@@ -242,7 +242,7 @@ def initialize
   end

   frame = FrameThinkDebug.new
-  AnythingWindow.new(frame)
+  Window::Anything.new(frame)
   frame.start

 end
diff --git a/lib/vortex/input/input_base2.rb b/lib/vortex/input/input_base2.rb
index aa0adbf..f993c9d 100644
--- a/lib/vortex/input/input_base2.rb
+++ b/lib/vortex/input/input_base2.rb
@@ -109,7 +109,7 @@ def initialize
   end

   frame = FrameThinkDebug.new
-  AnythingWindow.new(frame)
+  Window::Anything.new(frame)
   frame.start

 end
diff --git a/lib/vortex/modes/std_mode.rb b/lib/vortex/modes/std_mode.rb
index eacdfc9..335b4ad 100644
--- a/lib/vortex/modes/std_mode.rb
+++ b/lib/vortex/modes/std_mode.rb
@@ -61,6 +61,6 @@ def initialize
   # Simulator.start(library)

   frame = Modes::StdMode.new
-  AnythingWindow.new(frame)
+  Window::Anything.new(frame)
   frame.start
 end
diff --git a/lib/vortex/modes/std_vs_mode.rb b/lib/vortex/modes/std_vs_mode.rb
index 93baab0..2278740 100644
--- a/lib/vortex/modes/std_vs_mode.rb
+++ b/lib/vortex/modes/std_vs_mode.rb
@@ -22,6 +22,6 @@ def initialize

 if $0 == __FILE__
   frame = Modes::StdVsMode.new
-  AnythingWindow.new(frame)
+  Window::Anything.new(frame)
   frame.start
 end
diff --git a/lib/vortex/modes/std_vs_single_mode.rb b/lib/vortex/modes/std_vs_single_mode.rb
index 56489f5..8cbcbd6 100644
--- a/lib/vortex/modes/std_vs_single_mode.rb
+++ b/lib/vortex/modes/std_vs_single_mode.rb
@@ -27,6 +27,6 @@ def initialize

 if $0 == __FILE__
   frame = Modes::StdVsSingleMode.new
-  AnythingWindow.new(frame)
+  Window::Anything.new(frame)
   frame.start
 end
diff --git a/lib/vortex/modes/tap_death_mode.rb b/lib/vortex/modes/tap_death_mode.rb
index 7be74e2..52edf5b 100644
--- a/lib/vortex/modes/tap_death_mode.rb
+++ b/lib/vortex/modes/tap_death_mode.rb
@@ -33,6 +33,6 @@ def initialize

 if $0 == __FILE__
   frame = Modes::FrameDeath.new
-  AnythingWindow.new(frame)
+  Window::Anything.new(frame)
   frame.start
 end
diff --git a/lib/vortex/modes/tap_death_swap_mode.rb b/lib/vortex/modes/tap_death_swap_mode.rb
index 3f1139d..95c89e0 100644
--- a/lib/vortex/modes/tap_death_swap_mode.rb
+++ b/lib/vortex/modes/tap_death_swap_mode.rb
@@ -20,6 +20,6 @@ def initialize

 if $0 == __FILE__
   frame = Modes::FrameDeathSwap.new
-  AnythingWindow.new(frame)
+  Window::Anything.new(frame)
   frame.start
 end
diff --git a/lib/vortex/modes/tap_doubles_mode.rb b/lib/vortex/modes/tap_doubles_mode.rb
index 12ed633..0db004a 100644
--- a/lib/vortex/modes/tap_doubles_mode.rb
+++ b/lib/vortex/modes/tap_doubles_mode.rb
@@ -24,6 +24,6 @@ def initialize

 if $0 == __FILE__
   frame = Modes::FrameDoubles.new
-  AnythingWindow.new(frame)
+  Window::Anything.new(frame)
   frame.start
 end
diff --git a/lib/vortex/modes/tap_extend_gm_mode.rb b/lib/vortex/modes/tap_extend_gm_mode.rb
index ab2963b..d0a14a1 100644
--- a/lib/vortex/modes/tap_extend_gm_mode.rb
+++ b/lib/vortex/modes/tap_extend_gm_mode.rb
@@ -22,6 +22,6 @@ def initialize

 if $0 == __FILE__
   frame = Modes::FrameExtendGM.new
-  AnythingWindow.new(frame)
+  Window::Anything.new(frame)
   frame.start
 end
diff --git a/lib/vortex/modes/tap_extend_m_mode.rb b/lib/vortex/modes/tap_extend_m_mode.rb
index 42787c2..86fcda8 100644
--- a/lib/vortex/modes/tap_extend_m_mode.rb
+++ b/lib/vortex/modes/tap_extend_m_mode.rb
@@ -32,6 +32,6 @@ def initialize

 if $0 == __FILE__
   frame = Modes::FrameExtendM.new
-  AnythingWindow.new(frame)
+  Window::Anything.new(frame)
   frame.start
 end
diff --git a/lib/vortex/modes/tap_item_vs_mode.rb b/lib/vortex/modes/tap_item_vs_mode.rb
index 621d64a..70097ab 100644
--- a/lib/vortex/modes/tap_item_vs_mode.rb
+++ b/lib/vortex/modes/tap_item_vs_mode.rb
@@ -428,6 +428,6 @@ def initialize
   # Simulator.start(library)

   frame = Modes::FrameVersus2.new
-  AnythingWindow.new(frame)
+  Window::Anything.new(frame)
   frame.start
 end
diff --git a/lib/vortex/modes/tap_master_20g_mode.rb b/lib/vortex/modes/tap_master_20g_mode.rb
index 9f9cc63..defba09 100644
--- a/lib/vortex/modes/tap_master_20g_mode.rb
+++ b/lib/vortex/modes/tap_master_20g_mode.rb
@@ -20,6 +20,6 @@ def initialize

 if $0 == __FILE__
   frame = Modes::FrameMaster20G.new
-  AnythingWindow.new(frame)
+  Window::Anything.new(frame)
   frame.start
 end
diff --git a/lib/vortex/modes/tap_master_20g_no_irs.rb b/lib/vortex/modes/tap_master_20g_no_irs.rb
index fc467a8..a53dd9f 100644
--- a/lib/vortex/modes/tap_master_20g_no_irs.rb
+++ b/lib/vortex/modes/tap_master_20g_no_irs.rb
@@ -20,6 +20,6 @@ def initialize

 if $0 == __FILE__
   frame = Modes::FrameMaster20GNoIRS.new
-  AnythingWindow.new(frame)
+  Window::Anything.new(frame)
   frame.start
 end
diff --git a/lib/vortex/modes/tap_master_marathon_mode.rb b/lib/vortex/modes/tap_master_marathon_mode.rb
index a81f8dc..cbf2021 100644
--- a/lib/vortex/modes/tap_master_marathon_mode.rb
+++ b/lib/vortex/modes/tap_master_marathon_mode.rb
@@ -23,6 +23,6 @@ def initialize

 if $0 == __FILE__
   frame = Modes::FrameMaster20GMarathon.new
-  AnythingWindow.new(frame)
+  Window::Anything.new(frame)
   frame.start
 end
diff --git a/lib/vortex/modes/tap_master_mode.rb b/lib/vortex/modes/tap_master_mode.rb
index e087552..d7274d7 100644
--- a/lib/vortex/modes/tap_master_mode.rb
+++ b/lib/vortex/modes/tap_master_mode.rb
@@ -53,6 +53,6 @@ def initialize

 if $0 == __FILE__
   frame = Modes::FrameMaster.new
-  AnythingWindow.new(frame)
+  Window::Anything.new(frame)
   frame.start
 end
diff --git a/lib/vortex/modes/tap_master_multi_2p.rb b/lib/vortex/modes/tap_master_multi_2p.rb
index 1441f60..713fe19 100644
--- a/lib/vortex/modes/tap_master_multi_2p.rb
+++ b/lib/vortex/modes/tap_master_multi_2p.rb
@@ -35,6 +35,6 @@ def initialize

 if $0 == __FILE__
   frame = Modes::FrameMaster2P.new
-  AnythingWindow.new(frame)
+  Window::Anything.new(frame)
   frame.start
 end
diff --git a/lib/vortex/modes/tap_master_swap_mode.rb b/lib/vortex/modes/tap_master_swap_mode.rb
index 2db62cc..4368c9c 100644
--- a/lib/vortex/modes/tap_master_swap_mode.rb
+++ b/lib/vortex/modes/tap_master_swap_mode.rb
@@ -20,6 +20,6 @@ def initialize

 if $0 == __FILE__
   frame = Modes::FrameMasterSwap.new
-  AnythingWindow.new(frame)
+  Window::Anything.new(frame)
   frame.start
 end
diff --git a/lib/vortex/modes/tap_vs_doubles_mode.rb b/lib/vortex/modes/tap_vs_doubles_mode.rb
index 8e63a6b..3695baf 100644
--- a/lib/vortex/modes/tap_vs_doubles_mode.rb
+++ b/lib/vortex/modes/tap_vs_doubles_mode.rb
@@ -27,6 +27,6 @@ def initialize

 if $0 == __FILE__
   frame = Modes::FrameDoublesVersus.new
-  AnythingWindow.new(frame)
+  Window::Anything.new(frame)
   frame.start
 end
diff --git a/lib/vortex/modes/tap_vs_mode.rb b/lib/vortex/modes/tap_vs_mode.rb
index c88f269..2f39829 100644
--- a/lib/vortex/modes/tap_vs_mode.rb
+++ b/lib/vortex/modes/tap_vs_mode.rb
@@ -39,6 +39,6 @@ def initialize

 if $0 == __FILE__
   frame = Modes::FrameVersus.new
-  AnythingWindow.new(frame)
+  Window::Anything.new(frame)
   frame.start
 end
diff --git a/lib/vortex/modes/tds_mode.rb b/lib/vortex/modes/tds_mode.rb
index d28c88c..fbcfa83 100644
--- a/lib/vortex/modes/tds_mode.rb
+++ b/lib/vortex/modes/tds_mode.rb
@@ -20,6 +20,6 @@ def initialize

 if $0 == __FILE__
   frame = Modes::FrameTDS.new
-  AnythingWindow.new(frame)
+  Window::Anything.new(frame)
   frame.start
 end
diff --git a/lib/vortex/modes/tgm_20g_mode.rb b/lib/vortex/modes/tgm_20g_mode.rb
index 5ef082a..683348c 100644
--- a/lib/vortex/modes/tgm_20g_mode.rb
+++ b/lib/vortex/modes/tgm_20g_mode.rb
@@ -20,6 +20,6 @@ def initialize

 if $0 == __FILE__
   frame = Modes::FrameTGM20G.new
-  AnythingWindow.new(frame)
+  Window::Anything.new(frame)
   frame.start
 end
diff --git a/lib/vortex/modes/tgm_debug_mode.rb b/lib/vortex/modes/tgm_debug_mode.rb
index 5acbbcc..8be0209 100644
--- a/lib/vortex/modes/tgm_debug_mode.rb
+++ b/lib/vortex/modes/tgm_debug_mode.rb
@@ -26,6 +26,6 @@ def initialize

 if $0 == __FILE__
   frame = Modes::FrameMasterDebug.new
-  AnythingWindow.new(frame)
+  Window::Anything.new(frame)
   frame.start
 end
diff --git a/lib/vortex/modes/tgm_item_mode.rb b/lib/vortex/modes/tgm_item_mode.rb
index 3a7dc1b..24dd5d0 100644
--- a/lib/vortex/modes/tgm_item_mode.rb
+++ b/lib/vortex/modes/tgm_item_mode.rb
@@ -20,6 +20,6 @@ def initialize

 if $0 == __FILE__
   frame = Modes::FrameTGMItem.new
-  AnythingWindow.new(frame)
+  Window::Anything.new(frame)
   frame.start
 end
diff --git a/lib/vortex/modes/tgm_mode.rb b/lib/vortex/modes/tgm_mode.rb
index 44dcb53..030d95c 100644
--- a/lib/vortex/modes/tgm_mode.rb
+++ b/lib/vortex/modes/tgm_mode.rb
@@ -279,6 +279,6 @@ def initialize

 if $0 == __FILE__
   frame = Modes::FrameTGM.new
-  AnythingWindow.new(frame)
+  Window::Anything.new(frame)
   frame.start
 end
diff --git a/lib/vortex/modes/tgm_plus_mode.rb b/lib/vortex/modes/tgm_plus_mode.rb
index 6b67023..051f6f2 100644
--- a/lib/vortex/modes/tgm_plus_mode.rb
+++ b/lib/vortex/modes/tgm_plus_mode.rb
@@ -120,6 +120,6 @@ def initialize

 if $0 == __FILE__
   frame = Modes::FrameTGMPlus.new
-  AnythingWindow.new(frame)
+  Window::Anything.new(frame)
   frame.start
 end
diff --git a/lib/vortex/recfile.rb b/lib/vortex/recfile.rb
index 7839a7d..f02ac91 100644
--- a/lib/vortex/recfile.rb
+++ b/lib/vortex/recfile.rb
@@ -23,7 +23,7 @@ class RecFile
   # 表示
   def self.view(marshal, drawobj=UI::Sdl::Draw.instance)
     frame = BasicMode.replay1(marshal)
-    draw_obs = AnythingWindow.new(frame, drawobj)
+    draw_obs = Window::Anything.new(frame, drawobj)
     frame.safe_show
     draw_obs.close
   end
@@ -31,14 +31,14 @@ def self.view(marshal, drawobj=UI::Sdl::Draw.instance)
   # 再生
   def self.replay1(marshal, input_classes)
     frame = BasicMode.replay_with_input(marshal, input_classes)
-    AnythingWindow.new(frame)
+    Window::Anything.new(frame)
     frame.start
   end

   # リプレイ。marshal から marshal2 の間をリプレイする。
   def self.replay_a_to_b(marshal1, marshal2)
     frame = BasicMode.replay_a_to_b(marshal1, marshal2)
-    AnythingWindow.new(frame)
+    Window::Anything.new(frame)
     frame.start
   end

diff --git a/lib/vortex/simulator.rb b/lib/vortex/simulator.rb
index 5d979de..7d4e3f6 100644
--- a/lib/vortex/simulator.rb
+++ b/lib/vortex/simulator.rb
@@ -185,7 +185,7 @@ def load_library(library)
   # 通常の繰り返し練習
   def start(data, fps: nil, loop: 256)
     frame = SimulateFrame.new(data)
-    ui = SimulateWindow.new(frame)
+    ui = Window::SimulateWindow.new(frame)
     ui.title = data[:title]
     ret = nil
     loop.times do
@@ -201,7 +201,7 @@ def start(data, fps: nil, loop: 256)
   # 静止画表示
   def view(data)
     frame = SimulateFrame.new(data)
-    ui = SimulateWindow.new(frame)
+    ui = Window::SimulateWindow.new(frame)
     ui.title = data[:title]
     # frame.safe_show
     frame.show_loop
@@ -212,7 +212,7 @@ def view(data)
   def start_auto(data, fps: nil)
     return if data[:input].nil?
     frame = AutoPlayFrame.new(data)
-    ui = SimulateWindow.new(frame)
+    ui = Window::SimulateWindow.new(frame)
     ui.title = data[:title]
     ret = frame.start(fps)
     ret
diff --git a/lib/vortex/simulator/classic_piece_optimize.rb b/lib/vortex/simulator/classic_piece_optimize.rb
index 7fe2a03..8b92703 100644
--- a/lib/vortex/simulator/classic_piece_optimize.rb
+++ b/lib/vortex/simulator/classic_piece_optimize.rb
@@ -266,9 +266,9 @@ def make_data_ary

 if $0 == __FILE__
   library = ClassicPieceControllOptimize.new.make_data_ary
-  library.each{|e| break if Simulator.start_auto(e, fps: 60) == :break}
+  library.each{|e| break if Simulator.start_auto(e) == :break}
   exit
-  Simulator.start_auto(library[0],60)
-  Simulator.start_auto(library.reverse.find{|e|!e[:input].nil?}, 10)
-  Simulator.start(library.reverse.find{|e|!e[:input].nil?}, fps: 60)
+  Simulator.start_auto(library[0])
+  Simulator.start_auto(library.reverse.find{|e|!e[:input].nil?})
+  Simulator.start(library.reverse.find{|e|!e[:input].nil?})
 end
diff --git a/lib/vortex/simulator/ipepapi_checkmate.rb b/lib/vortex/simulator/ipepapi_checkmate.rb
index 07802e4..b1111b6 100644
--- a/lib/vortex/simulator/ipepapi_checkmate.rb
+++ b/lib/vortex/simulator/ipepapi_checkmate.rb
@@ -347,14 +347,14 @@
 ]

 if $0 == __FILE__
-  library.each{|e| break if Simulator.start_auto(e, fps: 60) == :break}
+  library.each{|e| break if Simulator.start_auto(e) == :break}
   exit
   if ARGV.empty?
-    Simulator.start_auto(library.reverse.find{|e|!e[:input].nil?}, fps: 60)
+    Simulator.start_auto(library.reverse.find{|e|!e[:input].nil?})
   else
-    Simulator.start(library.reverse.find{|e|!e[:input].nil?}, fps: 60)
+    Simulator.start(library.reverse.find{|e|!e[:input].nil?})
   end
-  Simulator.start_auto(library[0],60)
+  Simulator.start_auto(library[0])
 end

 library
diff --git a/lib/vortex/simulator/ipepapi_synchro_checkmate.rb b/lib/vortex/simulator/ipepapi_synchro_checkmate.rb
index 9d4caec..6fb5516 100644
--- a/lib/vortex/simulator/ipepapi_synchro_checkmate.rb
+++ b/lib/vortex/simulator/ipepapi_synchro_checkmate.rb
@@ -195,14 +195,14 @@
   Simulator.start_auto(library[2])
   exit

-  library.each{|e| break if Simulator.start_auto(e, fps: 60) == :break}
+  library.each{|e| break if Simulator.start_auto(e) == :break}
   exit
   if ARGV.empty?
-    Simulator.start_auto(library.reverse.find{|e|!e[:input].nil?}, fps: 60)
+    Simulator.start_auto(library.reverse.find{|e|!e[:input].nil?})
   else
-    Simulator.start(library.reverse.find{|e|!e[:input].nil?}, fps: 60)
+    Simulator.start(library.reverse.find{|e|!e[:input].nil?})
   end
-  Simulator.start_auto(library[0],60)
+  Simulator.start_auto(library[0])
 end

 library
diff --git a/lib/vortex/simulator/ipepapi_tech.rb b/lib/vortex/simulator/ipepapi_tech.rb
index b2e15a4..8e6c871 100644
--- a/lib/vortex/simulator/ipepapi_tech.rb
+++ b/lib/vortex/simulator/ipepapi_tech.rb
@@ -1806,14 +1806,14 @@
 ]

 if $0 == __FILE__
-  library.each{|e| break if Simulator.start_auto(e, fps: 60) == :break}
+  library.each{|e| break if Simulator.start_auto(e) == :break}
   exit
   if ARGV.empty?
-    Simulator.start_auto(library.reverse.find{|e|!e[:input].nil?}, fps: 60)
+    Simulator.start_auto(library.reverse.find{|e|!e[:input].nil?})
   else
-    Simulator.start(library.reverse.find{|e|!e[:input].nil?}, fps: 60)
+    Simulator.start(library.reverse.find{|e|!e[:input].nil?})
   end
-  Simulator.start_auto(library[0],60)
+  Simulator.start_auto(library[0])
 end

 library
diff --git a/lib/vortex/simulator/panoo_basic_technique.rb b/lib/vortex/simulator/panoo_basic_technique.rb
index 5777f8d..c824f8d 100644
--- a/lib/vortex/simulator/panoo_basic_technique.rb
+++ b/lib/vortex/simulator/panoo_basic_technique.rb
@@ -182,11 +182,11 @@
 ]

 if $0 == __FILE__
-  library.each{|e| break if Simulator.start_auto(e, fps: 60) == :break}
+  library.each{|e| break if Simulator.start_auto(e) == :break}
   exit
   Simulator.start_auto(library[0], fps: 30)
   Simulator.start_auto(library.reverse.find{|e|!e[:input].nil?}, 10)
-  Simulator.start(library.reverse.find{|e|!e[:input].nil?}, fps: 60)
+  Simulator.start(library.reverse.find{|e|!e[:input].nil?})
 end

 library
diff --git a/lib/vortex/simulator/sample.rb b/lib/vortex/simulator/sample.rb
index f988841..d01127d 100644
--- a/lib/vortex/simulator/sample.rb
+++ b/lib/vortex/simulator/sample.rb
@@ -39,19 +39,19 @@
   },
 ]

-# Simulator.start(library[0], 60)
+# Simulator.start(library[0])
 # exit;

 if $0 == __FILE__
-  library.each{|e| Simulator.start_auto(e, fps: 60) == :break and break}
+  library.each{|e| Simulator.start_auto(e) == :break and break}
   exit
   if ARGV.empty?
-    Simulator.start_auto(library.reverse.find{|e|!e[:input].nil?}, fps: 60)
+    Simulator.start_auto(library.reverse.find{|e|!e[:input].nil?})
   else
-    Simulator.start(library.reverse.find{|e|!e[:input].nil?}, fps: 60)
+    Simulator.start(library.reverse.find{|e|!e[:input].nil?})
   end
-  Simulator.start_auto(library[0],60)
+  Simulator.start_auto(library[0])
 end

 library
diff --git a/lib/vortex/simulator/srs.rb b/lib/vortex/simulator/srs.rb
index 65b6897..14e7929 100644
--- a/lib/vortex/simulator/srs.rb
+++ b/lib/vortex/simulator/srs.rb
@@ -111,7 +111,7 @@
   # else
   #   Simulator.start(library.reverse.find{|e|!e[:input].nil?})
   # end
-  # Simulator.start_auto(library[0],60)
+  # Simulator.start_auto(library[0])
 end

 library
diff --git a/lib/vortex/simulator/t_spin.rb b/lib/vortex/simulator/t_spin.rb
index 77203d5..42bf91e 100644
--- a/lib/vortex/simulator/t_spin.rb
+++ b/lib/vortex/simulator/t_spin.rb
@@ -153,7 +153,7 @@ def field_data
     field = Field.new(width: 10, height: 10, @params[:field])
     frame = BasicMode.new([field], [Player.new(field, 4, TextInputUnit.new(@params[:input]), Randomizer::OriginalRec.new(@params[:randomizer]), controller, Piece::World)])
     if false
-      ui = UI::SimulateWindow.new(frame)
+      ui = UI::Window::SimulateWindow.new(frame)
       ui.title = @params[:randomizer]
       ret = frame.start{Gtk.main_iteration while Gtk.events_pending?}
       ui.close
@@ -326,8 +326,8 @@ def to_wiki_article
   end
 end

-# Simulator.start(library[0], 60)
-# Simulator.start_auto(library[0], 60)
+# Simulator.start(library[0])
+# Simulator.start_auto(library[0])

 if $0 == __FILE__
   fname = Pathname("t_spin.txt").expand_path
diff --git a/lib/vortex/simulator/test.rb b/lib/vortex/simulator/test.rb
old mode 100644
new mode 100755
index 19b4d1b..09bf62f
--- a/lib/vortex/simulator/test.rb
+++ b/lib/vortex/simulator/test.rb
@@ -1,4 +1,5 @@
 #!/usr/local/bin/ruby
+# -*- coding: raw-text -*-
 # $Id$

 $: << '..'
@@ -43,7 +44,7 @@
 ]

 if $0 == __FILE__
-  Simulator.start(library.reverse.find{|e|!e[:input].nil?}, 60)
+  Simulator.start(library.reverse.find{|e|!e[:input].nil?})

 #   Simulator::Movie.sample_to_mpeg(library[0],"hoge.mpg", __FILE__)
@@ -56,8 +57,8 @@

   exit
-  library.each{|e| break if Simulator.start_sample(e, 60) == :break}
-  Simulator.start_sample(library.reverse.find{|e|!e[:input].nil?}, 60)
+  library.each{|e| break if Simulator.start_sample(e) == :break}
+  Simulator.start_sample(library.reverse.find{|e|!e[:input].nil?})
 end

 library
diff --git a/lib/vortex/simulator/tetris_ds_algorithm.rb b/lib/vortex/simulator/tetris_ds_algorithm.rb
index 5c7cf88..400b2d4 100644
--- a/lib/vortex/simulator/tetris_ds_algorithm.rb
+++ b/lib/vortex/simulator/tetris_ds_algorithm.rb
@@ -86,18 +86,18 @@
   },
 ]

-# Simulator.start(library[0], 60)
+# Simulator.start(library[0])
 # exit;

 if $0 == __FILE__
-#   library.each{|e| Simulator.start_auto(e, fps: 60) == :break and break}
+#   library.each{|e| Simulator.start_auto(e) == :break and break}
 #   exit
   if ARGV.empty?
-    Simulator.start_auto(library.reverse.find{|e|!e[:input].nil?}, fps: 60)
+    Simulator.start_auto(library.reverse.find{|e|!e[:input].nil?})
   else
-    Simulator.start(library.reverse.find{|e|!e[:input].nil?}, fps: 60)
+    Simulator.start(library.reverse.find{|e|!e[:input].nil?})
   end
-  Simulator.start_auto(library[0],60)
+  Simulator.start_auto(library[0])
 end

 library
diff --git a/lib/vortex/simulator/tetris_ds_puzzle.rb b/lib/vortex/simulator/tetris_ds_puzzle.rb
index 8b32e1f..6afee93 100644
--- a/lib/vortex/simulator/tetris_ds_puzzle.rb
+++ b/lib/vortex/simulator/tetris_ds_puzzle.rb
@@ -4170,11 +4170,11 @@
 ]

 if $0 == __FILE__
-  # Simulator.start_auto(library[199], 60)
-  # Simulator.start_auto(library[199], 60)
+  # Simulator.start_auto(library[199])
+  # Simulator.start_auto(library[199])
   # exit

-  # Simulator.start(library[8], 60)
+  # Simulator.start(library[8])
   # exit

   # g = UI::Sdl::Draw.instance
@@ -4197,7 +4197,7 @@
   else
     Simulator.start(library.reverse.find{|e|!e[:input].nil?}, 0)
   end
-  # Simulator.start_auto(library[0],60)
+  # Simulator.start_auto(library[0])
 end

 library
diff --git a/lib/vortex/simulator/world_rule_piece_controll_optimize.rb b/lib/vortex/simulator/world_rule_piece_controll_optimize.rb
index e637417..8e73879 100644
--- a/lib/vortex/simulator/world_rule_piece_controll_optimize.rb
+++ b/lib/vortex/simulator/world_rule_piece_controll_optimize.rb
@@ -798,7 +798,7 @@ def field_data(piece, operation_key)
     field = Field.new(width: 10, height: 10, OptimizeHelper.make_hole_field(piece, {:piece_class => Piece::World, :field_color => "x"}))
     frame = BasicMode.new([field], [Player.new(field, 4, TextInputUnit.new(operation[:input] + " u_ *"), Randomizer::OriginalRec.new(piece.color.downcase[0..0]), controller, Piece::World)])
     if false
-      ui = UI::SimulateWindow.new(frame)
+      ui = UI::Window::SimulateWindow.new(frame)
       ui.title = title
       ret = frame.start
       ui.close
diff --git a/lib/vortex/simulator/world_training.rb b/lib/vortex/simulator/world_training.rb
index 77ebe14..36013b9 100644
--- a/lib/vortex/simulator/world_training.rb
+++ b/lib/vortex/simulator/world_training.rb
@@ -52,7 +52,7 @@
   # else
   #   Simulator.start(library.reverse.find{|e|!e[:input].nil?})
   # end
-  # Simulator.start_auto(library[0],60)
+  # Simulator.start_auto(library[0])
 end

 library
diff --git a/lib/vortex/simulator/zon_checkmate.rb b/lib/vortex/simulator/zon_checkmate.rb
index 77f26b2..0046bfa 100644
--- a/lib/vortex/simulator/zon_checkmate.rb
+++ b/lib/vortex/simulator/zon_checkmate.rb
@@ -79,11 +79,11 @@
 ]

 if $0 == __FILE__
-  library.each{|e| break if Simulator.start_auto(e, fps: 60) == :break}
+  library.each{|e| break if Simulator.start_auto(e) == :break}
   exit
   Simulator.start_auto(library[0], fps: 30)
-  Simulator.start(library.reverse.find{|e|!e[:input].nil?}, fps: 60)
-  Simulator.start_auto(library.reverse.find{|e|!e[:input].nil?}, fps: 60)
+  Simulator.start(library.reverse.find{|e|!e[:input].nil?})
+  Simulator.start_auto(library.reverse.find{|e|!e[:input].nil?})
 end

 library
diff --git a/lib/vortex/tetac_cli.rb b/lib/vortex/tetac_cli.rb
index 2c717f3..2ea45bd 100644
--- a/lib/vortex/tetac_cli.rb
+++ b/lib/vortex/tetac_cli.rb
@@ -71,7 +71,7 @@ def self.execute(args)
       backtrack = BackTrack.new(pieces, options[:width].to_i, 20+Field::INVISIBLE_AREA, options[:all], &print_proc)

       if options[:sdl]
-        gui = FieldWindow.new(backtrack)
+        gui = Windows::FieldWindow.new(backtrack)
         result = catch(:exit) do
           backtrack.backtrack
         end
diff --git a/lib/vortex/window.rb b/lib/vortex/window.rb
index ec87500..154742e 100644
--- a/lib/vortex/window.rb
+++ b/lib/vortex/window.rb
@@ -48,454 +48,466 @@
     })
 end

-class FieldWindow < SimpleDelegator
-  def initialize(target)
-    super(Stylet::Base.instance)
-    sdl_initialize
-    target.add_observer(self)
-
-    @margin = 45
-    @y_center = 0
-
-    @base_x = 0
-    @base_y = 0
-
-    # 時計まわりで 9 時から A B C D として 左・右・左・右 としているが、
-    # PS3 コントローラーでの操作は D C を 左・右 とするのがルールなのでそれに合わせる
-    if defined? ::Stylet::JoystickAdapters::Ps3StandardAdapter
-      Stylet::JoystickAdapters::Ps3StandardAdapter.button_assigns.update(btC: 14, btD: 13)
-    end
-
-    SDL::Mouse.hide
-  end
+module Window
+  class FieldWindow < SimpleDelegator
+    def initialize(target)
+      super(Stylet::Base.instance)
+      sdl_initialize
+      target.add_observer(self)
+
+      @margin = 45
+      @y_center = 0
+
+      @base_x = 0
+      @base_y = 0
+
+      # 時計まわりで 9 時から A B C D として 左・右・左・右 としているが、
+      # PS3 コントローラーでの操作は D C を 左・右 とするのがルールなのでそれに合わせる
+      if defined? ::Stylet::JoystickAdapters::Ps3StandardAdapter
+        Stylet::JoystickAdapters::Ps3StandardAdapter.button_assigns.update(btC: 14, btD: 13)
+      end

-  def update(*args)
-    next_frame do |win|
-      render_all(*args)
+      SDL::Mouse.hide
     end
-  end

-  def render_all(field)
-    set_draw_point(field, index: 0, field_count: 1)
-    display_field(field)
-    draw_piece_frame_line(field)
-    display_field_frame(field)
-  end
+    def update(*args)
+      next_frame do |win|
+        render_all(*args)
+      end
+    end

-  def close
-  end
+    def render_all(field)
+      set_draw_point(field, index: 0, field_count: 1)
+      display_field(field)
+      draw_piece_frame_line(field)
+      display_field_frame(field)
+    end

-  def edge
-    Vortex.config.edge
-  end
+    def close
+    end

-  ################################################################################
+    def edge
+      Vortex.config.edge
+    end

-  def draw_line2(a, b, c, d, color) # FIXME
-    draw_line(vec2[a, b], vec2[c, d], :color => color)
-  end
+    ################################################################################

-  # 基準点とシンボルの対応
-  #
-  #   lt    ct    rt
-  #    +----------+
-  #    |          |
-  # lt2+----------+rt2
-  #    |          |
-  #    |          |
-  #    |          |
-  #    |          |
-  #    +----------+
-  #   lb    cb    rb
-  #
-  def set_draw_point(field, index:, field_count:, base_x: 0, base_y: 0)
-
-    # w, h = 仮想フィールド幅
-    w = field.width  * get_wsize
-    h = field.height * get_hsize
-
-    # 不可視領域の高さ
-    a = Field::INVISIBLE_AREA * get_hsize
-
-    sw = screen.w - @margin * 2 # マージンを省いた画面幅
-    @local_width = sw / field_count     # 一つのフィールドが使用可能な最大幅
-
-    # フィールド不可視部分の左上角
-    x = @margin + (@local_width * index) + (@local_width / 2) - (w / 2)
-    x -= get_slide(field_count)         # フィルードを中央から左にずらす
-    y = screen.h / 2 - h / 2 + @y_center
-
-    x += base_x
-    y += base_y
-
-    # 各基準点の計算
-    @basic_points = {
-      :lt  => [x,     y  ],
-      :rt  => [x+w,   y  ],
-      :lb  => [x,     y+h],
-      :rb  => [x+w,   y+h],
-      :cb  => [x+w/2, y+h],
-      :lt2 => [x,     y+a],
-      :rt2 => [x+w,   y+a],
-      :ct2 => [x+w/2, y+a],
-    }
-  end
+    def draw_line2(a, b, c, d, color) # FIXME
+      draw_line(vec2[a, b], vec2[c, d], :color => color)
+    end

-  # 中心をずらすのはフィールドが二つ以上表示されるときだけにする。
-  # ずらす量はフィールド幅の半分
-  def get_slide(field_count)
-    if field_count >= 2
-      @local_width * 0.15
-    else
-      0
+    # 基準点とシンボルの対応
+    #
+    #   lt    ct    rt
+    #    +----------+
+    #    |          |
+    # lt2+----------+rt2
+    #    |          |
+    #    |          |
+    #    |          |
+    #    |          |
+    #    +----------+
+    #   lb    cb    rb
+    #
+    def set_draw_point(field, index:, field_count:, base_x: 0, base_y: 0)
+
+      # w, h = 仮想フィールド幅
+      w = field.width  * get_wsize
+      h = field.height * get_hsize
+
+      # 不可視領域の高さ
+      a = Field::INVISIBLE_AREA * get_hsize
+
+      sw = screen.w - @margin * 2 # マージンを省いた画面幅
+      @local_width = sw / field_count     # 一つのフィールドが使用可能な最大幅
+
+      # フィールド不可視部分の左上角
+      x = @margin + (@local_width * index) + (@local_width / 2) - (w / 2)
+      x -= get_slide(field_count)         # フィルードを中央から左にずらす
+      y = screen.h / 2 - h / 2 + @y_center
+
+      x += base_x
+      y += base_y
+
+      # 各基準点の計算
+      @basic_points = {
+        :lt  => [x,     y  ],
+        :rt  => [x+w,   y  ],
+        :lb  => [x,     y+h],
+        :rb  => [x+w,   y+h],
+        :cb  => [x+w/2, y+h],
+        :lt2 => [x,     y+a],
+        :rt2 => [x+w,   y+a],
+        :ct2 => [x+w/2, y+a],
+      }
     end
-  end

-  def get_locate(sym)
-    @basic_points[sym]
-  end
+    # 中心をずらすのはフィールドが二つ以上表示されるときだけにする。
+    # ずらす量はフィールド幅の半分
+    def get_slide(field_count)
+      if field_count >= 2
+        @local_width * 0.15
+      else
+        0
+      end
+    end

-  def get_wsize
-    Vortex.config.piece_size[0]
-  end
+    def get_wsize
+      Vortex.config.piece_size[0]
+    end

-  def get_hsize
-    Vortex.config.piece_size[1]
-  end
+    def get_hsize
+      Vortex.config.piece_size[1]
+    end

-  def grid_main(fields)
-    return unless $DEBUG
+    def grid_main(fields)
+      return unless $DEBUG

-    # 画面真中の水平線
-    draw_line2(0, screen.h/2, screen.w, screen.h/2, "g")
+      # 画面真中の水平線
+      draw_line2(0, screen.h/2, screen.w, screen.h/2, "g")

-    # 各フィールドが持つ最大幅の幅を縦線で書く
-    fields.size.succ.times{|i|
-      x = @margin + @local_width * i
-      draw_line2(x, 0, x, screen.h, "g")
-    }
-  end
+      # 各フィールドが持つ最大幅の幅を縦線で書く
+      fields.size.succ.times{|i|
+        x = @margin + @local_width * i
+        draw_line2(x, 0, x, screen.h, "g")
+      }
+    end

-  def rel_vputs_l(base, x, y, str, **options)
-    vputs str, options.merge(:vector => vec2[x, y] + get_locate(base))
-  end
+    def rel_vputs_l(base, x, y, str, **options)
+      vputs str, options.merge(:vector => vec2[x, y] + @basic_points[base])
+    end

-  def rel_vputs_r(*args, **options); rel_vputs_l(*args, options.merge(:align => :right)); end
-  def rel_vputs_c(*args, **options); rel_vputs_l(*args, options.merge(:align => :center)); end
+    def rel_vputs_r(*args, **options); rel_vputs_l(*args, options.merge(:align => :right)); end
+    def rel_vputs_c(*args, **options); rel_vputs_l(*args, options.merge(:align => :center)); end

-  ################################################################################
+    ################################################################################

-  # 指定したブロックオブジェクトの表示
-  def display_piece(field, piece)
-    return unless piece
-    tx, ty = get_locate(:lt)
-    piece.get_points.each do |po|
-      x0 = tx + (piece.pos.x + po.x) * get_wsize
-      y0 = ty + (piece.pos.y + po.y) * get_hsize
-      __draw_rect(x0, y0, get_wsize, get_hsize, :color => piece.view_color, :fill => !piece.item)
+    # 指定したブロックオブジェクトの表示
+    def display_piece(field, piece)
+      return unless piece
+      tx, ty = @basic_points[:lt]
+      piece.get_points.each do |po|
+        x0 = tx + (piece.pos.x + po.x) * get_wsize
+        y0 = ty + (piece.pos.y + po.y) * get_hsize
+        __draw_rect(x0, y0, get_wsize, get_hsize, :color => piece.view_color, :fill => !piece.item)
+      end
     end
-  end

-  # フィールドの表示
-  def display_field(field)
-    # 既存セル表示
-    bx, by = get_locate(:lt)
-    (Field::INVISIBLE_AREA...field.height).each do |y|
-      field.width.times do |x|
-        cell = field.get(x, y)
-        if cell && cell.visible?
-          __draw_rect(
-            bx + x * get_wsize,
-            by + y * get_hsize,
-            get_wsize, get_hsize,
-            :color => "dark_" + cell.color, :fill => !cell.item)
+    # フィールドの表示
+    def display_field(field)
+      # 既存セル表示
+      bx, by = @basic_points[:lt]
+      (Field::INVISIBLE_AREA...field.height).each do |y|
+        field.width.times do |x|
+          cell = field.get(x, y)
+          if cell && cell.visible?
+            __draw_rect(
+              bx + x * get_wsize,
+              by + y * get_hsize,
+              get_wsize, get_hsize,
+              :color => "dark_" + cell.color, :fill => !cell.item)
+          end
         end
       end
     end
-  end

-  # フィールド回り表示
-  def display_field_frame(field)
-    # 枠
-    bx, by = get_locate(:lt2)
-    __draw_rect(
-      bx - 1,
-      by - 1,
-      get_wsize * field.width   + 1,
-      get_hsize * field.height2 + 1,
-      :color => "frame")
-
-    # 上枠の表示
-    bx, by = get_locate(:lt)
-    __draw_rect(
-      bx - 1,
-      by - 1,
-      get_wsize * field.width  + 1,
-      get_hsize * field.height + 1,
-      :color => "frame") if $DEBUG
-  end
+    # フィールド回り表示
+    def display_field_frame(field)
+      # 枠
+      bx, by = @basic_points[:lt2]
+      __draw_rect(
+        bx - 1,
+        by - 1,
+        get_wsize * field.width   + 1,
+        get_hsize * field.height2 + 1,
+        :color => "frame")
+
+      unless Stylet.production
+        # 上枠の表示
+        bx, by = @basic_points[:lt]
+        __draw_rect(
+          bx - 1,
+          by - 1,
+          get_wsize * field.width  + 1,
+          get_hsize * field.height + 1,
+          :color => "frame")
+      end
+    end

-  def draw_piece_frame_line(field)
-    return unless edge
-
-    bx, by = get_locate(:lt)
-
-    # 縦のライン
-    (Field::INVISIBLE_AREA..field.bottom).each {|y|
-      prev = false
-      (field.width+1).times{|x|
-        cell = field.get(x, y)
-        gap = nil
-        if cell
-          if !prev
-            # 空白 -> ブロック
-            gap = (edge == :inside) ? 0 : -1
-          end
-        else
-          if prev
-            # ブロック -> 空白
-            gap = (edge == :inside) ? -1 : 0
-          end
-        end
-        if gap
-          sx = bx + x * get_wsize + gap
-          sy = by + y * get_hsize
-          ex = sx
-          ey = by + (y+1) * get_hsize - 1
-          draw_line2(sx, sy, ex, ey, "edge")
-        end
-        prev = cell
-      }
-    }
-
-    # 横のライン
-    field.width.times{|x|
-      prev = false
-      (field.height+1).times {|y|
-        cell = field.get(x, y)
-        # 一番下の淵と上の淵は描画しないようにのif文
-        if Field::INVISIBLE_AREA < y
+    def draw_piece_frame_line(field)
+      return unless edge
+
+      bx, by = @basic_points[:lt]
+
+      # 縦のライン
+      (Field::INVISIBLE_AREA..field.bottom).each {|y|
+        prev = false
+        (field.width+1).times{|x|
+          cell = field.get(x, y)
           gap = nil
           if cell
             if !prev
-              # 空->ブロック
+              # 空白 -> ブロック
               gap = (edge == :inside) ? 0 : -1
             end
           else
             if prev
-              # ブロック->空
+              # ブロック -> 空白
               gap = (edge == :inside) ? -1 : 0
             end
           end
           if gap
-            sx = bx + x * get_wsize
-            sy = by + y * get_hsize + gap
-            ex = bx + (x+1) * get_wsize - 1
-            if true           # 1ドットの補正を行うか?
-              if edge == :inside
-                # 90度曲る線の角を繋ぐために補正した側のブロックの左もしくは右のブロックがあればその方向に1ドットのばして引く
-                sx -= 1 if field.get(x-1, y+gap)
-                ex += 1 if field.get(x+1, y+gap)
-              else
-                # 外に引く場合は、広げる時と短くする場合がある
-                sx += !field.get(x-1, y+gap) ? -1 : +1
-                ex += !field.get(x+1, y+gap) ? +1 : -1
+            sx = bx + x * get_wsize + gap
+            sy = by + y * get_hsize
+            ex = sx
+            ey = by + (y+1) * get_hsize - 1
+            draw_line2(sx, sy, ex, ey, "edge")
+          end
+          prev = cell
+        }
+      }
+
+      # 横のライン
+      field.width.times{|x|
+        prev = false
+        (field.height+1).times {|y|
+          cell = field.get(x, y)
+          # 一番下の淵と上の淵は描画しないようにのif文
+          if Field::INVISIBLE_AREA < y
+            gap = nil
+            if cell
+              if !prev
+                # 空->ブロック
+                gap = (edge == :inside) ? 0 : -1
+              end
+            else
+              if prev
+                # ブロック->空
+                gap = (edge == :inside) ? -1 : 0
+              end
+            end
+            if gap
+              sx = bx + x * get_wsize
+              sy = by + y * get_hsize + gap
+              ex = bx + (x+1) * get_wsize - 1
+              if true           # 1ドットの補正を行うか?
+                if edge == :inside
+                  # 90度曲る線の角を繋ぐために補正した側のブロックの左もしくは右のブロックがあればその方向に1ドットのばして引く
+                  sx -= 1 if field.get(x-1, y+gap)
+                  ex += 1 if field.get(x+1, y+gap)
+                else
+                  # 外に引く場合は、広げる時と短くする場合がある
+                  sx += !field.get(x-1, y+gap) ? -1 : +1
+                  ex += !field.get(x+1, y+gap) ? +1 : -1
+                end
               end
+              draw_line2(sx, sy, ex, sy, "edge")
             end
-            draw_line2(sx, sy, ex, sy, "edge")
           end
-        end
-        prev = cell
+          prev = cell
+        }
       }
-    }
+    end
   end
-end

-class FrameWindow < FieldWindow
-  def render_all(frame)
-
-    # フィールドを順番に表示していく
-    frame.fields.each_with_index do |field, index|
-      # 現在のフィールドに所属しているプレイヤーを調べる。
-      players = frame.players.select{|pl|pl.field.object_id == field.object_id}
-
-      # アイテム効果がある状態
-      # jump_counter は controller.jump_counter ではなく field.jump_counter となるべきじゃなかろうか
-      base_x = 0
-      base_y = 0
-      # if player = players.find{|pl|pl.controller.respond_to?(:i_state) && pl.controller.i_state}
-      #   if player.controller.jump_counter
-      if player = players.find{|pl|pl.controller.respond_to?(:jump) && pl.controller.jump}
+  class FrameWindow < FieldWindow
+    def render_all(frame)
+
+      # フィールドを順番に表示していく
+      frame.fields.each_with_index do |field, index|
+        # 現在のフィールドに所属しているプレイヤーを調べる。
+        players = frame.players.select{|pl|pl.field.object_id == field.object_id}
+
+        # アイテム効果がある状態
+        # jump_counter は controller.jump_counter ではなく field.jump_counter となるべきじゃなかろうか
+        base_x = 0
+        base_y = 0
         # if player = players.find{|pl|pl.controller.respond_to?(:i_state) && pl.controller.i_state}
-        # end
-        jump = player.controller.jump
-        base_x = rcos(jump.angle + 0.5 / jump.frames * jump.counter) * jump_distance * jump.w
-        base_y = rsin(jump.angle + 0.5 / jump.frames * jump.counter) * jump_distance * jump.h
-      end
+        #   if player.controller.jump_counter
+        if player = players.find{|pl|pl.controller.respond_to?(:jump) && pl.controller.jump}
+          # if player = players.find{|pl|pl.controller.respond_to?(:i_state) && pl.controller.i_state}
+          # end
+          jump = player.controller.jump
+          base_x = rcos(jump.angle + 0.5 / jump.frames * jump.counter) * jump_distance * jump.w
+          base_y = rsin(jump.angle + 0.5 / jump.frames * jump.counter) * jump_distance * jump.h
+        end

-      set_draw_point(field, index: index, field_count: frame.fields.size, base_x: base_x, base_y: base_y)
-      display_field(field)
+        set_draw_point(field, index: index, field_count: frame.fields.size, base_x: base_x, base_y: base_y)
+        display_field(field)

-      if false
-        uniq_cell_count = field.all_cells.collect{|e|e.object_id}.uniq.size
-        dputs "uniq_cell_count: #{uniq_cell_count}"
-      end
+        if false
+          uniq_cell_count = field.all_cells.collect{|e|e.object_id}.uniq.size
+          dputs "uniq_cell_count: #{uniq_cell_count}"
+        end

-      # players.each{|player|
-      #   if player.current_piece
-      #     dputs player.current_piece.may_be_twist
-      #   end
-      #   if player.controller.ren_counter
-      #     dputs "#{player.controller.ren_counter} REN"
-      #   end
-      # }
-
-      # 現在のフィールドに所属しているプレイヤーの誰かが life.nil? であれば edge を表示する。
-      if players.find{|pl|pl.controller.life.nil?}
-        draw_piece_frame_line(field)
-      end
+        # players.each{|player|
+        #   if player.current_piece
+        #     dputs player.current_piece.may_be_twist
+        #   end
+        #   if player.controller.ren_counter
+        #     dputs "#{player.controller.ren_counter} REN"
+        #   end
+        # }
+
+        # 現在のフィールドに所属しているプレイヤーの誰かが life.nil? であれば edge を表示する。
+        if players.find{|pl|pl.controller.life.nil?}
+          draw_piece_frame_line(field)
+        end

-      # 枠表示
-      display_field_frame(field)
+        # 枠表示
+        display_field_frame(field)

-      # 現在のフィールドに所属しているプレイヤーを探してブロックを描画する
-      players = frame.players.select{|pl|pl.field.object_id == field.object_id}
-      players.each do |pl|
-        display_piece(pl.field, pl.current_piece)
-        pl.next_pieces.each {|piece| display_piece(pl.field, piece) }
-        if pl.controller.respond_to?(:hold_piece)
-          display_piece(pl.field, pl.controller.hold_piece)
+        # 現在のフィールドに所属しているプレイヤーを探してブロックを描画する
+        players = frame.players.select{|pl|pl.field.object_id == field.object_id}
+        players.each do |pl|
+          display_piece(pl.field, pl.current_piece)
+          pl.next_pieces.each {|piece| display_piece(pl.field, piece) }
+          if pl.controller.respond_to?(:hold_piece)
+            display_piece(pl.field, pl.controller.hold_piece)
+          end
         end
-      end

-      # 現在のフィールドに所属している先頭のプレイヤーのレベル情報を表示する。
-      # フィールドが複数ある場合にここが重なってしまう。画面の大きさを変えれば
-      # 重ならないのでこれでいいことにする。
-      if respond_to?(:params_display)
-        params_display(players.first)
-      end
+        # 現在のフィールドに所属している先頭のプレイヤーのレベル情報を表示する。
+        # フィールドが複数ある場合にここが重なってしまう。画面の大きさを変えれば
+        # 重ならないのでこれでいいことにする。
+        if respond_to?(:params_display)
+          params_display(players.first)
+        end

+      end
+      grid_main(frame.fields)
     end
-    grid_main(frame.fields)
-  end

-  def jump_distance
-    get_hsize * 2
+    def jump_distance
+      get_hsize * 2
+    end
   end
-end

-module TimeDisplay
-  def params_display(player)
-    super if defined? super
-    if player.controller.respond_to?(:time_count_str)
-      rel_vputs_l(:cb, -6*4-4, 3, player.controller.time_count_str)
+  module TimeDisplay
+    def params_display(player)
+      super if defined? super
+      if player.controller.respond_to?(:time_count_str)
+        rel_vputs_l(:cb, -6*4-4, 3, player.controller.time_count_str)
+      end
     end
   end
-end

-module RenDisplay
-  def params_display(player)
-    super if defined? super
-    controller = player.controller
-    if controller.respond_to?(:ren_counter) && controller.ren_counter || true
-      rel_vputs_r(:lb, -12, -40, "#{controller.ren_counter} REN")
+  module RenDisplay
+    def params_display(player)
+      super if defined? super
+      controller = player.controller
+      if controller.respond_to?(:ren_counter) && controller.ren_counter || true
+        rel_vputs_r(:lb, -12, -40, "#{controller.ren_counter} REN")
+      end
     end
   end
-end

-module AttacableDisplay
-  def params_display(player)
-    super if defined? super
-    controller = player.controller
-    if player.current_piece
-      if player.current_piece.may_be_twist
-        rel_vputs_r(:lb, -12, -80, "#{player.current_piece.may_be_twist.upcase} ?")
+  module AttacableDisplay
+    def params_display(player)
+      super if defined? super
+      controller = player.controller
+      if player.current_piece
+        if player.current_piece.may_be_twist
+          rel_vputs_r(:lb, -12, -80, "#{player.current_piece.may_be_twist.upcase} ?")
+        end
       end
-    end
-    if player.lock_piece
-      if player.lock_piece.may_be_twist
-        rel_vputs_r(:lb, -12, -100, "#{player.lock_piece.may_be_twist.upcase}")
+      if player.lock_piece
+        if player.lock_piece.may_be_twist
+          rel_vputs_r(:lb, -12, -100, "#{player.lock_piece.may_be_twist.upcase}")
+        end
       end
+      if controller.respond_to?(:btb_counter) && controller.btb_counter
+        rel_vputs_r(:lb, -12, -60, "BTB #{controller.btb_counter}")
+      end
+      if controller.attack_cell_lines.size >= 1
+        rel_vputs_r(:lb, -12, -20, "ATK #{controller.attack_cell_lines.size}")
+      end
+      controller.total_attack_logs.last(5).each.with_index{|str, i|
+        rel_vputs_r(:lt2, -12, 30 + 20 * i, str)
+      }
+
+      unless Stylet.production
+        tx, ty = @basic_points[:lb]
+        __draw_rect(
+          tx - get_wsize * 8,
+          ty - controller.total_attack_lines * get_hsize,
+          get_wsize,
+          controller.total_attack_lines * get_hsize,
+          :color => "x", :fill => true)
+      end
+
+      # draw_line(vec2[a, b], vec2[c, d], :color => color)
     end
-    if controller.respond_to?(:btb_counter) && controller.btb_counter
-      rel_vputs_r(:lb, -12, -60, "BTB #{controller.btb_counter}")
-    end
-    if controller.attack_cell_lines.size >= 1
-      rel_vputs_r(:lb, -12, -20, "ATK #{controller.attack_cell_lines.size}")
-    end
-    controller.total_attack_logs.last(5).each.with_index{|str, i|
-      rel_vputs_r(:lt2, -12, 30 + 20 * i, str)
-    }
   end
-end

-# TGM依存の表示クラス
-class AnythingWindow < FrameWindow
-  include TimeDisplay
+  # TGM依存の表示クラス
+  class Anything < FrameWindow
+    include TimeDisplay

-  include RenDisplay
-  include AttacableDisplay
+    include RenDisplay
+    include AttacableDisplay

-  def params_display(player)
-    super if defined? super
-    controller = player.controller
-    # rel_vputs_l(:lt, -20, 0, controller.mode_name)
-    if controller.respond_to?(:grade_name)
-      rel_vputs_l(:rt, 6, 8, controller.grade_name)
-    end
-    if controller.respond_to?(:score_count)
-      rel_vputs_l(:rb, 6, -66+1-10, "SCORE")
-      rel_vputs_l(:rb, 6, -50+1-10, controller.score_count)
-    end
-    if controller.respond_to?(:level_count)
-      rel_vputs_l(:rb, 6, -36+3-1, "LEVEL")
-      rel_vputs_l(:rb, 6, -20+3-1, controller.level_count)
+    def params_display(player)
+      super if defined? super
+      controller = player.controller
+      # rel_vputs_l(:lt, -20, 0, controller.mode_name)
+      if controller.respond_to?(:grade_name)
+        rel_vputs_l(:rt, 6, 8, controller.grade_name)
+      end
+      if controller.respond_to?(:score_count)
+        rel_vputs_l(:rb, 6, -66+1-10, "SCORE")
+        rel_vputs_l(:rb, 6, -50+1-10, controller.score_count)
+      end
+      if controller.respond_to?(:level_count)
+        rel_vputs_l(:rb, 6, -36+3-1, "LEVEL")
+        rel_vputs_l(:rb, 6, -20+3-1, controller.level_count)
+      end
     end
   end
-end

-# トレーニングモード用
-class SimulateWindow < FrameWindow
-  # include TimeDisplay
-  include RenDisplay
-  include AttacableDisplay
+  # トレーニングモード用
+  class SimulateWindow < FrameWindow
+    # include TimeDisplay
+    include RenDisplay
+    include AttacableDisplay

-  def render_all(frame)
-    super
-    # controller = frame.players.first.controller
-    # gprint(0, 32, "<#{controller.mode_name}>")
-    # gprint(0, 64, "<#{frame.simulator_params[:title]}>")
-    # gprint(0, 64, frame.simulator_params[:title])
+    def render_all(frame)
+      super
+      # controller = frame.players.first.controller
+      # gprint(0, 32, "<#{controller.mode_name}>")
+      # gprint(0, 64, "<#{frame.simulator_params[:title]}>")
+      # gprint(0, 64, frame.simulator_params[:title])

-    # rel_vputs_l(:cb, -6*2, 3, "%3d" % frame.simulator_params[:title].to_i)
+      # rel_vputs_l(:cb, -6*2, 3, "%3d" % frame.simulator_params[:title].to_i)

-    if frame.respond_to?(:simulator_params)
-      rel_vputs_r(:lt2, -12, 4, frame.simulator_params[:title])
+      if frame.respond_to?(:simulator_params)
+        rel_vputs_r(:lt2, -12, 4, frame.simulator_params[:title])
+      end
     end
-  end

-  # def system_line
-  # end
-end
+    # def system_line
+    # end
+  end

-# TGM依存の表示クラス(に画面のスナップショットを取る機能付き)
-class AnythingWindowWithSnapshot < AnythingWindow
-  attr_accessor :snapdir
+  # TGM依存の表示クラス(に画面のスナップショットを取る機能付き)
+  class AnythingWindowWithSnapshot < Window::Anything
+    attr_accessor :snapdir

-  def render_all(*args)
-    super
-    save_bmp(File.join(@snapdir, ("%06d" % [@count]) + ".bmp"))
-  end
+    def render_all(*args)
+      super
+      save_bmp(File.join(@snapdir, ("%06d" % [@count]) + ".bmp"))
+    end

-  def system_line
-    "#{@count}"
+    def system_line
+      "#{@count}"
+    end
   end
 end

 if $0 == __FILE__
   require_relative "backtrack"
   backtrack = BackTrack.new("cybrmg", 10, 22, true)
-  FieldWindow.new(backtrack)
+  Window::FieldWindow.new(backtrack)
   catch (:exit) {
     backtrack.backtrack
   }
diff --git a/test2/test_graph.rb b/test2/test_graph.rb
index 7d60585..29c89b6 100644
--- a/test2/test_graph.rb
+++ b/test2/test_graph.rb
@@ -7,7 +7,7 @@
 class TestGraph < Test::Unit::TestCase
   def test_graph
     frame = Modes::FrameMaster.new
-    AnythingWindow.new(frame)
+    Window::Anything.new(frame)
     frame.next_frame
     frame.save_direct_info
     rec = RecFile.new(frame.to_marshal_binary)
diff --git a/test2/test_recfile.rb b/test2/test_recfile.rb
index f2f9239..b7458c0 100644
--- a/test2/test_recfile.rb
+++ b/test2/test_recfile.rb
@@ -12,7 +12,7 @@ class TestRecFileSeg < Test::Unit::TestCase
   def setup

     frame = Modes::FrameMaster.new
-    AnythingWindow.new(frame)
+    Window::Anything.new(frame)
     2.times{frame.next_frame}
     frame.save_direct_info
     open(REC_FILE, "w"){|f|f.write(frame.to_marshal_binary)}
diff --git a/training2/main.rb b/training2/main.rb
index cc0d2ec..0d32d3c 100644
--- a/training2/main.rb
+++ b/training2/main.rb
@@ -111,9 +111,9 @@
     A r| u *   # J
     Al d_ B u  # T

-    r| l u *   # O
-    Al| u *    # Z
-    Al d_ A u  # T
+    r| l u *    # O
+    Al| u *     # Z
+    Al d_ A u * # T
     EOS
   },
   {
@@ -226,7 +226,6 @@
     lA| d_ A     u * # T
     EOS
   },
-
   {
     :title       => "TKI積み",
     :url         => "http://bugloderunner.my.land.to/tetDS/TKId.html",
@@ -260,20 +259,181 @@

     EOS
   },
+  {
+    :title       => "ダブルダガー",
+    :url         => ["http://tinyurl.com/lfya8h4", "http://mame.nekonikoban.org/TetrisTikei.htm"], # よく見る地形8より
+    :controller  => TrainingController.new,
+    :piece_class => Piece::World,
+    :randomizer => "JOSZT T",
+    :field       => <<-EOS,
+c.........
+c.........
+c.........
+c.o.......
+yyoppp....
+yyoop...x.
+xxxxxx.xxx
+  EOS
+    :input => <<-EOS,
+    *
+    Br| . B u *                 # J
+    r| u *                      # O
+    u *                         # S
+    l| B u *                    # Z
+    rB . r d_ B u *             # T
+    rB . r d_ B u *             # T
+    EOS
+  },
+  {
+    :title       => "クラッシュ",
+    :url         => "http://tinyurl.com/mbem4u5",
+    :controller  => TrainingController.new,
+    :piece_class => Piece::World,
+    :randomizer => "JT",
+    :field       => <<-EOS,
+# xxx....xxx
+xxx.ggxxxx
+xxxgg.xxxx
+  EOS
+    :input => <<-EOS,
+    *
+    Bl u *                      # J
+    Br d_ B u *                 # T
+    EOS
+  },
+
+  {
+    :title       => "3連TSD",
+    :url         => "http://tinyurl.com/mhnwy49",
+    :controller  => TrainingController.new,
+    :piece_class => Piece::World,
+    :randomizer => "JLZOITS JILOSZT LSTZOIJ T",
+    :field       => <<-EOS,
+  EOS
+    :input => <<-EOS,
+    *
+    lB| u *                     # J
+    l u *                       # L
+    A u *                       # Z
+    l u *                       # O
+    r| l u *                    # I
+    rA| u *                     # T
+    r| l u *                    # S
+
+    lB| u *                     # J
+    B u *                       # I
+    rB| . Bl u *                # L
+    r . r u *                   # O
+    rB| u *                     # S
+    l u *                       # Z
+    lB| d_ A . A d_ A u *       # T (TSD)
+
+    Br . Br u *                 # L
+    Br| u *                     # S
+    lB| d_ A . A u *            # T (TSD)
+    # 4巡目のTが来るまでアドリブ
+    u *                         # Z
+    r . r u *                   # O
+    rB| u *                     # I
+    rB| . lB u *                # J
+
+    lA| d_ A u *                # T (TSD)
+
+    EOS
+  },
+
+  {
+    :title       => "3連攻撃",
+    :url         => "http://tinyurl.com/mvk3shj",
+    :controller  => TrainingController.new,
+    :piece_class => Piece::World,
+    :randomizer => "JILTZOS IJZOLST SLZOJTI SJT",
+    :field       => <<-EOS,
+  EOS
+    :input => <<-EOS,
+    *
+    rA| u *                     # J
+    r| B u *                    # I
+    rA| u *                     # L
+    u *                         # T
+    lA u *                      # Z
+    l| u *                      # O
+    B u *                       # S
+
+    rB u *                      # I
+    rB u *                      # J
+    lA u *                      # Z
+    l| u *                      # O
+    l| u *                      # L
+    A u *                       # S
+    Ar| u *                     # T
+
+    l| u *                      # S
+    Al| . A u *                 # L
+    u *                         # Z
+    l| u *                      # O
+    Ar| u *                     # J
+    r| lA d_ A u *              # T (TSD)
+    r| A u *                    # I
+
+    rB u *                      # S
+    l u *                       # J
+    r| lA d_ A u *              # T (TSD)
+
+    EOS
+  },
+
+  {
+    :title       => "428砲",
+    :url         => "http://tinyurl.com/l7yrqh9",
+    :controller  => TrainingController.new,
+    :piece_class => Piece::World,
+    :randomizer => "JIOLZST STLOJIZ OST",
+    :field       => <<-EOS,
+  EOS
+    :input => <<-EOS,
+    *
+    l u *                       # J
+    r| u *                      # I
+    l| u *                      # O
+    Al u *                      # L
+    r| l u *                    # Z
+    rB| u *                     # S
+    B d_ B u *                  # T (TSD)
+
+    r u *                       # S
+    Bl| d_ A u *                # T (TSM)
+    Ar| u *                     # L
+    r u *                       # O
+    lA . A u *                  # J
+    lA| u *                     # I
+    l| B u *                    # Z
+
+    l u *                       # O
+    r . r u *                   # S
+    rA| d_ B . B u *            # T
+
+    EOS
+  },
 ]

 if $0 == __FILE__
-  Vortex.config.piece_size  = [4,4]
-  Stylet.config.screen_size = [640/4, 480/4]
-  Soundset[:default] = nil
+  # Vortex.config.piece_size  = [4,4]
+  # Stylet.config.screen_size = [640/4, 480/4]
+
+  # Vortex.config.piece_size  = [8*3, 8*3]
+  # Stylet.config.screen_size = [800, 600]
+
+  # Soundset[:default] = nil

   # library.each{|e| break if Simulator.start_auto(e) == :break}; exit
+
   # Simulator.start_auto(e)
   # Simulator.start_auto(library[0])
   # Simulator.start_auto(library[0])
   # Simulator.start_auto(library[0])
   # Simulator.start_auto(library[0])
-  # Simulator.start_auto(library.last, fps: 60); exit
+  # Simulator.start_auto(library.last); exit
   # Simulator.start(library[1]); exit
   # library.reverse.each{|e| break if Simulator.start_auto(e) == :break}; exit
INVISIBLE_AREA → hidden_lines
Window::* は suffix に Window をつけるルールとした
リファクタリング＆reset_mod追加