RSokoban 0.74 → 0.76

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. data/NEWS +33 -1
  2. data/README.rdoc +21 -14
  3. data/TODO +6 -12
  4. data/VERSION +1 -1
  5. data/bin/rsokoban +40 -3
  6. data/data/big.xsb +35 -0
  7. data/lib/rsokoban/config.rb +34 -0
  8. data/lib/rsokoban/crate.rb +4 -5
  9. data/lib/rsokoban/exception.rb +2 -0
  10. data/lib/rsokoban/game/game.rb +153 -0
  11. data/lib/rsokoban/game/game_curses.rb +11 -0
  12. data/lib/rsokoban/game/game_factory.rb +23 -0
  13. data/lib/rsokoban/game/game_gui.rb +27 -0
  14. data/lib/rsokoban/game/game_portable.rb +10 -0
  15. data/lib/rsokoban/game/game_tk.rb +11 -0
  16. data/lib/rsokoban/game/game_ui.rb +81 -0
  17. data/lib/rsokoban/game.rb +7 -238
  18. data/lib/rsokoban/install.rb +22 -0
  19. data/lib/rsokoban/layered_map.rb +139 -0
  20. data/lib/rsokoban/level.rb +112 -166
  21. data/lib/rsokoban/level_set.rb +4 -4
  22. data/lib/rsokoban/man.rb +3 -4
  23. data/lib/rsokoban/map.rb +91 -15
  24. data/lib/rsokoban/move_result.rb +2 -2
  25. data/lib/rsokoban/option.rb +4 -4
  26. data/lib/rsokoban/position.rb +1 -1
  27. data/lib/rsokoban/raw_level.rb +11 -2
  28. data/lib/rsokoban/record.rb +51 -0
  29. data/lib/rsokoban/set_loader.rb +108 -0
  30. data/lib/rsokoban/ui/base_ui.rb +1 -0
  31. data/lib/rsokoban/ui/console.rb +56 -25
  32. data/lib/rsokoban/ui/curses_console.rb +59 -33
  33. data/lib/rsokoban/ui/player_action.rb +13 -7
  34. data/lib/rsokoban/ui/skin.rb +105 -0
  35. data/lib/rsokoban/ui/tk_dialogs.rb +104 -18
  36. data/lib/rsokoban/ui/tk_ui.rb +410 -233
  37. data/lib/rsokoban/ui.rb +1 -0
  38. data/lib/rsokoban.rb +14 -2
  39. data/skins/AntiqueDesk/crate.bmp +0 -0
  40. data/skins/AntiqueDesk/crate_store.bmp +0 -0
  41. data/skins/AntiqueDesk/floor.bmp +0 -0
  42. data/skins/AntiqueDesk/man_down.bmp +0 -0
  43. data/skins/AntiqueDesk/man_left.bmp +0 -0
  44. data/skins/AntiqueDesk/man_right.bmp +0 -0
  45. data/skins/AntiqueDesk/man_store_down.bmp +0 -0
  46. data/skins/AntiqueDesk/man_store_left.bmp +0 -0
  47. data/skins/AntiqueDesk/man_store_right.bmp +0 -0
  48. data/skins/AntiqueDesk/man_store_up.bmp +0 -0
  49. data/skins/AntiqueDesk/man_up.bmp +0 -0
  50. data/skins/AntiqueDesk/outside.bmp +0 -0
  51. data/skins/AntiqueDesk/skin.conf +3 -0
  52. data/skins/AntiqueDesk/store.bmp +0 -0
  53. data/skins/AntiqueDesk/wall.bmp +0 -0
  54. data/skins/BlueGranite/outside.bmp +0 -0
  55. data/skins/BlueGranite/skin.conf +3 -0
  56. data/skins/HeavyMetal/crate.bmp +0 -0
  57. data/skins/HeavyMetal/crate_store.bmp +0 -0
  58. data/skins/HeavyMetal/floor.bmp +0 -0
  59. data/skins/HeavyMetal/man.bmp +0 -0
  60. data/skins/HeavyMetal/man_store.bmp +0 -0
  61. data/skins/HeavyMetal/outside.bmp +0 -0
  62. data/skins/HeavyMetal/skin.conf +3 -0
  63. data/skins/HeavyMetal/store.bmp +0 -0
  64. data/skins/HeavyMetal/wall.bmp +0 -0
  65. data/skins/HeavyMetal/wall_d.bmp +0 -0
  66. data/skins/HeavyMetal/wall_dl.bmp +0 -0
  67. data/skins/HeavyMetal/wall_dlr.bmp +0 -0
  68. data/skins/HeavyMetal/wall_dr.bmp +0 -0
  69. data/skins/HeavyMetal/wall_l.bmp +0 -0
  70. data/skins/HeavyMetal/wall_lr.bmp +0 -0
  71. data/skins/HeavyMetal/wall_r.bmp +0 -0
  72. data/skins/HeavyMetal/wall_u.bmp +0 -0
  73. data/skins/HeavyMetal/wall_ud.bmp +0 -0
  74. data/skins/HeavyMetal/wall_udl.bmp +0 -0
  75. data/skins/HeavyMetal/wall_udlr.bmp +0 -0
  76. data/skins/HeavyMetal/wall_udr.bmp +0 -0
  77. data/skins/HeavyMetal/wall_ul.bmp +0 -0
  78. data/skins/HeavyMetal/wall_ulr.bmp +0 -0
  79. data/skins/HeavyMetal/wall_ur.bmp +0 -0
  80. data/test/record/original.yaml +2 -0
  81. data/test/tc_game.rb +24 -15
  82. data/test/tc_game_factory.rb +40 -0
  83. data/test/tc_game_gui.rb +26 -0
  84. data/test/tc_game_ui.rb +153 -0
  85. data/test/tc_install.rb +12 -0
  86. data/test/tc_layered_map.rb +105 -0
  87. data/test/tc_level.rb +109 -107
  88. data/test/tc_level_set.rb +4 -4
  89. data/test/tc_map.rb +46 -10
  90. data/test/tc_record.rb +100 -0
  91. data/test/{tc_level_loader.rb → tc_set_loader.rb} +25 -24
  92. data/test/test.rb +9 -2
  93. data/test/ui/tc_skin.rb +71 -0
  94. metadata +89 -26
  95. data/lib/rsokoban/level_loader.rb +0 -81
  96. data/lib/rsokoban/ui/tk_box.rb +0 -21
  97. data/skins/default/outside.bmp +0 -0
  98. data/skins/default/readme +0 -1
  99. /data/skins/{default → BlueGranite}/crate.bmp +0 -0
  100. /data/skins/{default → BlueGranite}/crate_store.bmp +0 -0
  101. /data/skins/{default → BlueGranite}/floor.bmp +0 -0
  102. /data/skins/{default → BlueGranite}/man_down.bmp +0 -0
  103. /data/skins/{default → BlueGranite}/man_left.bmp +0 -0
  104. /data/skins/{default → BlueGranite}/man_right.bmp +0 -0
  105. /data/skins/{default → BlueGranite}/man_store_down.bmp +0 -0
  106. /data/skins/{default → BlueGranite}/man_store_left.bmp +0 -0
  107. /data/skins/{default → BlueGranite}/man_store_right.bmp +0 -0
  108. /data/skins/{default → BlueGranite}/man_store_up.bmp +0 -0
  109. /data/skins/{default → BlueGranite}/man_up.bmp +0 -0
  110. /data/skins/{default → BlueGranite}/store.bmp +0 -0
  111. /data/skins/{default → BlueGranite}/wall.bmp +0 -0
@@ -13,10 +13,9 @@ module RSokoban::UI
13
13
  @state = :cancel
14
14
  grab
15
15
 
16
- @frame_north = TkFrame.new(self) do
16
+ @frame_north = Tk::Tile::Frame.new(self) do
17
17
  grid(:row => 0, :column => 0, :columnspan => 2, :sticky => :we)
18
- padx 10
19
- pady 10
18
+ padding 10
20
19
  end
21
20
 
22
21
  $spinval = TkVariable.new
@@ -30,14 +29,14 @@ module RSokoban::UI
30
29
  @spin.focus
31
30
  @spin.bind 'Key-Return', proc{ ok_on_clic }
32
31
 
33
- @ok = TkButton.new(self) do
32
+ @ok = Tk::Tile::Button.new(self) do
34
33
  text 'OK'
35
34
  grid(:row => 1, :column => 0)
36
35
  default :active
37
36
  end
38
37
  @ok.command { ok_on_clic }
39
38
 
40
- @cancel = TkButton.new(self) do
39
+ @cancel = Tk::Tile::Button.new(self) do
41
40
  text 'Cancel'
42
41
  grid(:row => 1, :column => 1)
43
42
  end
@@ -69,6 +68,95 @@ module RSokoban::UI
69
68
  end
70
69
  end
71
70
 
71
+ # As dialog box, I allow the user to select a skin.
72
+ # @since 0.76
73
+ class SkinDialog < TkToplevel
74
+ include RSokoban
75
+
76
+ def initialize(root, title)
77
+ super(root)
78
+ title(title)
79
+ width(300)
80
+ height(400)
81
+ @state = 'CANCEL'
82
+ grab
83
+ self['resizable'] = false, false
84
+
85
+ @skins = Skin.new.list_skins
86
+ $listval = TkVariable.new(@skins)
87
+ @value = @skins[0]
88
+
89
+ # A frame for the listbox
90
+ @frame_north = Tk::Tile::Frame.new(self) do
91
+ grid(:row => 0, :column => 0, :columnspan => 2, :sticky => :we)
92
+ padding 10
93
+ end
94
+
95
+ @list = TkListbox.new(@frame_north) do
96
+ width 40
97
+ height 8
98
+ listvariable $listval
99
+ grid(:row => 0, :column => 0, :sticky => :we)
100
+ end
101
+
102
+ @list.bind 'Double-1', proc{ ok_on_clic }
103
+ @list.bind 'Return', proc{ ok_on_clic }
104
+
105
+
106
+ scroll = Tk::Tile::Scrollbar.new(@frame_north) do
107
+ orient 'vertical'
108
+ grid(:row => 0, :column => 1, :sticky => :ns)
109
+ end
110
+
111
+ @list.yscrollcommand(proc { |*args| scroll.set(*args) })
112
+ scroll.command(proc { |*args| @list.yview(*args) })
113
+
114
+ # The buttons
115
+ @ok = Tk::Tile::Button.new(self) do
116
+ text 'OK'
117
+ grid(:row => 2, :column => 0)
118
+ default :active
119
+ end
120
+ @ok.command { ok_on_clic }
121
+
122
+ @cancel = Tk::Tile::Button.new(self) do
123
+ text 'Cancel'
124
+ grid(:row => 2, :column => 1)
125
+ end
126
+ @cancel.command { cancel_on_clic }
127
+
128
+ @list.focus
129
+ wait_destroy
130
+ end
131
+
132
+ # @return true if user clicked the OK button
133
+ def ok?
134
+ @state == 'OK'
135
+ end
136
+
137
+ # @return [String] the name of the set
138
+ def value
139
+ @value
140
+ end
141
+
142
+ private
143
+
144
+ def ok_on_clic
145
+ @state = 'OK'
146
+ idx = @list.curselection
147
+ unless idx.empty?
148
+ @value = Skin.new.path_of_skin @skins[idx[0]]
149
+ end
150
+ destroy
151
+ end
152
+
153
+ def cancel_on_clic
154
+ @state = 'CANCEL'
155
+ destroy
156
+ end
157
+
158
+ end
159
+
72
160
  # As dialog box, I allow the user to choose a set name.
73
161
  class SetDialog < TkToplevel
74
162
  include RSokoban
@@ -89,10 +177,9 @@ module RSokoban::UI
89
177
  @value = @xsb[0]
90
178
 
91
179
  # A frame for the listbox
92
- @frame_north = TkFrame.new(self) do
180
+ @frame_north = Tk::Tile::Frame.new(self) do
93
181
  grid(:row => 0, :column => 0, :columnspan => 2, :sticky => :we)
94
- padx 10
95
- pady 10
182
+ padding 10
96
183
  end
97
184
 
98
185
  @list = TkListbox.new(@frame_north) do
@@ -107,7 +194,7 @@ module RSokoban::UI
107
194
  @list.bind 'Return', proc{ ok_on_clic }
108
195
 
109
196
 
110
- scroll = TkScrollbar.new(@frame_north) do
197
+ scroll = Tk::Tile::Scrollbar.new(@frame_north) do
111
198
  orient 'vertical'
112
199
  grid(:row => 0, :column => 1, :sticky => :ns)
113
200
  end
@@ -116,10 +203,9 @@ module RSokoban::UI
116
203
  scroll.command(proc { |*args| @list.yview(*args) })
117
204
 
118
205
  # A frame for the set description
119
- @frame_desc = TkFrame.new(self) do
206
+ @frame_desc = Tk::Tile::Frame.new(self) do
120
207
  grid(:row => 1, :column => 0, :columnspan => 2, :sticky => :we)
121
- padx 10
122
- pady 10
208
+ padding 10
123
209
  end
124
210
 
125
211
  @desc = TkText.new(@frame_desc) do
@@ -131,7 +217,7 @@ module RSokoban::UI
131
217
  grid(:row => 0, :column => 0)
132
218
  end
133
219
 
134
- scroll2 = TkScrollbar.new(@frame_desc) do
220
+ scroll2 = Tk::Tile::Scrollbar.new(@frame_desc) do
135
221
  orient 'vertical'
136
222
  grid(:row => 0, :column => 1, :sticky => :ns)
137
223
  end
@@ -140,14 +226,14 @@ module RSokoban::UI
140
226
  scroll2.command(proc { |*args| @desc.yview(*args) })
141
227
 
142
228
  # The buttons
143
- @ok = TkButton.new(self) do
229
+ @ok = Tk::Tile::Button.new(self) do
144
230
  text 'OK'
145
231
  grid(:row => 2, :column => 0)
146
232
  default :active
147
233
  end
148
234
  @ok.command { ok_on_clic }
149
235
 
150
- @cancel = TkButton.new(self) do
236
+ @cancel = Tk::Tile::Button.new(self) do
151
237
  text 'Cancel'
152
238
  grid(:row => 2, :column => 1)
153
239
  end
@@ -193,7 +279,7 @@ module RSokoban::UI
193
279
 
194
280
  def show_description
195
281
  idx = @list.curselection
196
- ll = LevelLoader.new @xsb[idx[0]]
282
+ ll = SetLoader.new @xsb[idx[0]]
197
283
  @desc.delete '1.0', :end
198
284
  @desc.insert :end, ll.file_description
199
285
  end
@@ -211,7 +297,7 @@ module RSokoban::UI
211
297
 
212
298
  text = TkText.new(self) do
213
299
  borderwidth 1
214
- font TkFont.new('times 12 bold')
300
+ font 'TkTextFont'
215
301
  grid('row' => 0, 'column' => 0)
216
302
  end
217
303
 
@@ -225,7 +311,7 @@ EOS
225
311
 
226
312
  text.insert 'end', help
227
313
 
228
- @ok = TkButton.new(self) do
314
+ @ok = Tk::Tile::Button.new(self) do
229
315
  text 'OK'
230
316
  grid('row'=>1, 'column'=>0)
231
317
  end