RSokoban 0.74 → 0.76

Sign up to get free protection for your applications and to get access to all the features.
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