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.
- data/NEWS +33 -1
- data/README.rdoc +21 -14
- data/TODO +6 -12
- data/VERSION +1 -1
- data/bin/rsokoban +40 -3
- data/data/big.xsb +35 -0
- data/lib/rsokoban/config.rb +34 -0
- data/lib/rsokoban/crate.rb +4 -5
- data/lib/rsokoban/exception.rb +2 -0
- data/lib/rsokoban/game/game.rb +153 -0
- data/lib/rsokoban/game/game_curses.rb +11 -0
- data/lib/rsokoban/game/game_factory.rb +23 -0
- data/lib/rsokoban/game/game_gui.rb +27 -0
- data/lib/rsokoban/game/game_portable.rb +10 -0
- data/lib/rsokoban/game/game_tk.rb +11 -0
- data/lib/rsokoban/game/game_ui.rb +81 -0
- data/lib/rsokoban/game.rb +7 -238
- data/lib/rsokoban/install.rb +22 -0
- data/lib/rsokoban/layered_map.rb +139 -0
- data/lib/rsokoban/level.rb +112 -166
- data/lib/rsokoban/level_set.rb +4 -4
- data/lib/rsokoban/man.rb +3 -4
- data/lib/rsokoban/map.rb +91 -15
- data/lib/rsokoban/move_result.rb +2 -2
- data/lib/rsokoban/option.rb +4 -4
- data/lib/rsokoban/position.rb +1 -1
- data/lib/rsokoban/raw_level.rb +11 -2
- data/lib/rsokoban/record.rb +51 -0
- data/lib/rsokoban/set_loader.rb +108 -0
- data/lib/rsokoban/ui/base_ui.rb +1 -0
- data/lib/rsokoban/ui/console.rb +56 -25
- data/lib/rsokoban/ui/curses_console.rb +59 -33
- data/lib/rsokoban/ui/player_action.rb +13 -7
- data/lib/rsokoban/ui/skin.rb +105 -0
- data/lib/rsokoban/ui/tk_dialogs.rb +104 -18
- data/lib/rsokoban/ui/tk_ui.rb +410 -233
- data/lib/rsokoban/ui.rb +1 -0
- data/lib/rsokoban.rb +14 -2
- data/skins/AntiqueDesk/crate.bmp +0 -0
- data/skins/AntiqueDesk/crate_store.bmp +0 -0
- data/skins/AntiqueDesk/floor.bmp +0 -0
- data/skins/AntiqueDesk/man_down.bmp +0 -0
- data/skins/AntiqueDesk/man_left.bmp +0 -0
- data/skins/AntiqueDesk/man_right.bmp +0 -0
- data/skins/AntiqueDesk/man_store_down.bmp +0 -0
- data/skins/AntiqueDesk/man_store_left.bmp +0 -0
- data/skins/AntiqueDesk/man_store_right.bmp +0 -0
- data/skins/AntiqueDesk/man_store_up.bmp +0 -0
- data/skins/AntiqueDesk/man_up.bmp +0 -0
- data/skins/AntiqueDesk/outside.bmp +0 -0
- data/skins/AntiqueDesk/skin.conf +3 -0
- data/skins/AntiqueDesk/store.bmp +0 -0
- data/skins/AntiqueDesk/wall.bmp +0 -0
- data/skins/BlueGranite/outside.bmp +0 -0
- data/skins/BlueGranite/skin.conf +3 -0
- data/skins/HeavyMetal/crate.bmp +0 -0
- data/skins/HeavyMetal/crate_store.bmp +0 -0
- data/skins/HeavyMetal/floor.bmp +0 -0
- data/skins/HeavyMetal/man.bmp +0 -0
- data/skins/HeavyMetal/man_store.bmp +0 -0
- data/skins/HeavyMetal/outside.bmp +0 -0
- data/skins/HeavyMetal/skin.conf +3 -0
- data/skins/HeavyMetal/store.bmp +0 -0
- data/skins/HeavyMetal/wall.bmp +0 -0
- data/skins/HeavyMetal/wall_d.bmp +0 -0
- data/skins/HeavyMetal/wall_dl.bmp +0 -0
- data/skins/HeavyMetal/wall_dlr.bmp +0 -0
- data/skins/HeavyMetal/wall_dr.bmp +0 -0
- data/skins/HeavyMetal/wall_l.bmp +0 -0
- data/skins/HeavyMetal/wall_lr.bmp +0 -0
- data/skins/HeavyMetal/wall_r.bmp +0 -0
- data/skins/HeavyMetal/wall_u.bmp +0 -0
- data/skins/HeavyMetal/wall_ud.bmp +0 -0
- data/skins/HeavyMetal/wall_udl.bmp +0 -0
- data/skins/HeavyMetal/wall_udlr.bmp +0 -0
- data/skins/HeavyMetal/wall_udr.bmp +0 -0
- data/skins/HeavyMetal/wall_ul.bmp +0 -0
- data/skins/HeavyMetal/wall_ulr.bmp +0 -0
- data/skins/HeavyMetal/wall_ur.bmp +0 -0
- data/test/record/original.yaml +2 -0
- data/test/tc_game.rb +24 -15
- data/test/tc_game_factory.rb +40 -0
- data/test/tc_game_gui.rb +26 -0
- data/test/tc_game_ui.rb +153 -0
- data/test/tc_install.rb +12 -0
- data/test/tc_layered_map.rb +105 -0
- data/test/tc_level.rb +109 -107
- data/test/tc_level_set.rb +4 -4
- data/test/tc_map.rb +46 -10
- data/test/tc_record.rb +100 -0
- data/test/{tc_level_loader.rb → tc_set_loader.rb} +25 -24
- data/test/test.rb +9 -2
- data/test/ui/tc_skin.rb +71 -0
- metadata +89 -26
- data/lib/rsokoban/level_loader.rb +0 -81
- data/lib/rsokoban/ui/tk_box.rb +0 -21
- data/skins/default/outside.bmp +0 -0
- data/skins/default/readme +0 -1
- /data/skins/{default → BlueGranite}/crate.bmp +0 -0
- /data/skins/{default → BlueGranite}/crate_store.bmp +0 -0
- /data/skins/{default → BlueGranite}/floor.bmp +0 -0
- /data/skins/{default → BlueGranite}/man_down.bmp +0 -0
- /data/skins/{default → BlueGranite}/man_left.bmp +0 -0
- /data/skins/{default → BlueGranite}/man_right.bmp +0 -0
- /data/skins/{default → BlueGranite}/man_store_down.bmp +0 -0
- /data/skins/{default → BlueGranite}/man_store_left.bmp +0 -0
- /data/skins/{default → BlueGranite}/man_store_right.bmp +0 -0
- /data/skins/{default → BlueGranite}/man_store_up.bmp +0 -0
- /data/skins/{default → BlueGranite}/man_up.bmp +0 -0
- /data/skins/{default → BlueGranite}/store.bmp +0 -0
- /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 =
|
16
|
+
@frame_north = Tk::Tile::Frame.new(self) do
|
17
17
|
grid(:row => 0, :column => 0, :columnspan => 2, :sticky => :we)
|
18
|
-
|
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 =
|
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 =
|
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 =
|
180
|
+
@frame_north = Tk::Tile::Frame.new(self) do
|
93
181
|
grid(:row => 0, :column => 0, :columnspan => 2, :sticky => :we)
|
94
|
-
|
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 =
|
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 =
|
206
|
+
@frame_desc = Tk::Tile::Frame.new(self) do
|
120
207
|
grid(:row => 1, :column => 0, :columnspan => 2, :sticky => :we)
|
121
|
-
|
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 =
|
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 =
|
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 =
|
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 =
|
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
|
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 =
|
314
|
+
@ok = Tk::Tile::Button.new(self) do
|
229
315
|
text 'OK'
|
230
316
|
grid('row'=>1, 'column'=>0)
|
231
317
|
end
|