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
@@ -0,0 +1,108 @@
|
|
1
|
+
module RSokoban
|
2
|
+
|
3
|
+
# I load a file containing a bunch of levels for the game. On instanciation,
|
4
|
+
# you give me a filename (in xsb file format) containing one or more levels.
|
5
|
+
#
|
6
|
+
# You can then ask for a particular level (a Level object). You can use me too
|
7
|
+
# to find the description of a level.
|
8
|
+
# @todo give some examples
|
9
|
+
class SetLoader
|
10
|
+
|
11
|
+
# @param [String] filename an xsb filename.
|
12
|
+
# This file is searched in the data/ folder.
|
13
|
+
# @raise [RSokoban::NoFileError] if filename doesn't exist
|
14
|
+
# @see LevelSet overview of .xsb file format
|
15
|
+
def initialize filename
|
16
|
+
@filename = filename
|
17
|
+
@set = LevelSet.new
|
18
|
+
@file = open_file
|
19
|
+
get_title_of_the_set
|
20
|
+
get_description_of_the_set
|
21
|
+
get_levels_of_the_set
|
22
|
+
end
|
23
|
+
|
24
|
+
# @param [Fixnum] num a level number in base 1
|
25
|
+
# @return [Level]
|
26
|
+
def level num
|
27
|
+
raise LevelNumberTooHighError if num > @set.raw_levels.size
|
28
|
+
level = Level.new @set.raw_levels[num-1]
|
29
|
+
level.set_filename = File.basename @filename, '.xsb'
|
30
|
+
level.number = num
|
31
|
+
level
|
32
|
+
end
|
33
|
+
|
34
|
+
# Get the description field from the loaded set of levels.
|
35
|
+
# @return [String] possibly multi-line
|
36
|
+
def file_description
|
37
|
+
@set.description
|
38
|
+
end
|
39
|
+
|
40
|
+
# Get number of levels in this set.
|
41
|
+
# @return [Fixnum]
|
42
|
+
def size
|
43
|
+
@set.size
|
44
|
+
end
|
45
|
+
|
46
|
+
# Get title of this set.
|
47
|
+
# @return [String]
|
48
|
+
def title
|
49
|
+
@set.title
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
# @param [String] filename an xsb file to be found in data/ folder
|
55
|
+
# @return [File]
|
56
|
+
# @raise NoFileError
|
57
|
+
def open_file
|
58
|
+
filename = "#{$RSOKOBAN_DATA_PATH}/" + @filename
|
59
|
+
raise NoFileError unless File.exist?(filename)
|
60
|
+
open(filename)
|
61
|
+
end
|
62
|
+
|
63
|
+
def get_title_of_the_set
|
64
|
+
@set.title = @file.readline.get_xsb_info_line_chomp
|
65
|
+
# After the title, there must be a blank line
|
66
|
+
line = @file.readline
|
67
|
+
raise "Must be a blank line" unless line.strip.empty?
|
68
|
+
end
|
69
|
+
|
70
|
+
def get_description_of_the_set
|
71
|
+
line = @file.readline
|
72
|
+
desc = ''
|
73
|
+
while line[0] == ?; do
|
74
|
+
desc += line.get_xsb_info_line
|
75
|
+
line = @file.readline
|
76
|
+
end
|
77
|
+
@set.description = desc
|
78
|
+
# After the description, there must be a blank line
|
79
|
+
raise "Must be a blank line" unless line.strip.empty?
|
80
|
+
end
|
81
|
+
|
82
|
+
def get_levels_of_the_set
|
83
|
+
loop do
|
84
|
+
begin
|
85
|
+
line = @file.readline.chomp
|
86
|
+
raw = []
|
87
|
+
while line =~ /^ *#/
|
88
|
+
raw.push line
|
89
|
+
line = @file.readline.chomp
|
90
|
+
end
|
91
|
+
line = line.get_xsb_info_line_chomp
|
92
|
+
@set.raw_levels.push RawLevel.new(line, Map.new(raw)) unless raw.empty?
|
93
|
+
|
94
|
+
line = @file.readline
|
95
|
+
while line[0, 1] == ';'
|
96
|
+
line = @file.readline
|
97
|
+
end
|
98
|
+
# must be a blank line here
|
99
|
+
raise "Must be a blank line" unless line.strip.empty?
|
100
|
+
rescue EOFError
|
101
|
+
break
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
data/lib/rsokoban/ui/base_ui.rb
CHANGED
@@ -22,6 +22,7 @@ module RSokoban::UI
|
|
22
22
|
# @option hash [Fixnum] :total Number of level in this set (requiered if type==:start)
|
23
23
|
# @option hash [Fixnum] :move The move's number (requiered when type is :display or :win)
|
24
24
|
# @option hash [String] :error An error message. Could happen when type is :display or :start
|
25
|
+
# @option hash [Fixnum] :record The record for this level
|
25
26
|
# @return [PlayerAction] the user's action
|
26
27
|
# @since 0.73
|
27
28
|
# @todo write some examples
|
data/lib/rsokoban/ui/console.rb
CHANGED
@@ -12,40 +12,68 @@ module RSokoban::UI
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def get_action(hash)
|
15
|
+
initialize_members hash
|
16
|
+
display hash
|
17
|
+
ask_player hash
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def initialize_members hash
|
15
23
|
if hash[:type] == :start
|
16
24
|
@level_title = hash[:title]
|
17
25
|
@set_title = hash[:set]
|
18
26
|
@level_number = hash[:number]
|
19
27
|
@set_total = hash[:total]
|
20
|
-
|
21
|
-
display hash
|
22
|
-
if [:display, :start].include?(hash[:type])
|
23
|
-
ask_player
|
24
|
-
else
|
25
|
-
# assuming type == 'WIN'
|
26
|
-
ask_for_next_level
|
28
|
+
@record = hash[:record]
|
27
29
|
end
|
28
30
|
end
|
29
31
|
|
30
|
-
private
|
31
|
-
|
32
32
|
def display hash
|
33
|
-
|
34
|
-
|
33
|
+
clear_screen
|
34
|
+
display_header
|
35
|
+
display_move_number hash[:move]
|
36
|
+
display_map hash[:map]
|
37
|
+
end
|
38
|
+
|
39
|
+
# Assuming a console window of 24 lines height
|
40
|
+
def clear_screen
|
41
|
+
puts "\n" * 24
|
42
|
+
end
|
43
|
+
|
44
|
+
def display_header
|
35
45
|
puts "Set: #{@set_title}"
|
36
|
-
puts "Level: #{@level_title} (#{@level_number}/#{@set_total})"
|
46
|
+
puts "Level: #{@level_title} (#{@level_number}/#{@set_total}) Record: #{@record}"
|
37
47
|
puts "--------------------"
|
38
|
-
|
39
|
-
|
48
|
+
end
|
49
|
+
|
50
|
+
def display_move_number number
|
51
|
+
unless number.nil?
|
52
|
+
puts "move #{number}"
|
40
53
|
else
|
41
54
|
puts ''
|
42
55
|
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def display_map map
|
43
59
|
puts ''
|
44
|
-
|
60
|
+
map.each {|line|
|
61
|
+
line.gsub!(/o/, ' ')
|
62
|
+
puts line
|
63
|
+
}
|
45
64
|
puts ''
|
46
65
|
end
|
47
66
|
|
48
|
-
def
|
67
|
+
def ask_player hash
|
68
|
+
if [:display, :start].include?(hash[:type])
|
69
|
+
ask_for_action
|
70
|
+
else
|
71
|
+
# assuming type == 'WIN'
|
72
|
+
ask_for_next_level_or_quit
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def ask_for_next_level_or_quit
|
49
77
|
printf "Play next level ? "
|
50
78
|
line = gets.chomp
|
51
79
|
if ['yes', 'ye', 'y', 'YES', 'YE', 'Y'].include?(line)
|
@@ -55,19 +83,22 @@ module RSokoban::UI
|
|
55
83
|
end
|
56
84
|
end
|
57
85
|
|
58
|
-
def
|
59
|
-
|
60
|
-
line = gets.chomp
|
61
|
-
response = parse line
|
86
|
+
def ask_for_action
|
87
|
+
response = get_playerinput
|
62
88
|
if response.nil?
|
63
|
-
puts "Error
|
64
|
-
ask_player
|
89
|
+
puts "Error !"
|
65
90
|
elsif response.instance_of?(Symbol) and response == :help
|
66
91
|
display_help
|
67
|
-
ask_player
|
68
92
|
else
|
69
|
-
response
|
93
|
+
return response
|
70
94
|
end
|
95
|
+
ask_for_action
|
96
|
+
end
|
97
|
+
|
98
|
+
def get_playerinput
|
99
|
+
printf "Your choice ? "
|
100
|
+
line = gets.chomp
|
101
|
+
parse line
|
71
102
|
end
|
72
103
|
|
73
104
|
def parse str
|
@@ -81,7 +112,7 @@ module RSokoban::UI
|
|
81
112
|
when 'd' then PlayerAction.new(:right)
|
82
113
|
when '1'..'999'
|
83
114
|
if str.to_i > @set_total
|
84
|
-
|
115
|
+
ask_for_action
|
85
116
|
else
|
86
117
|
PlayerAction.new(str.to_i)
|
87
118
|
end
|
@@ -4,11 +4,11 @@ module RSokoban::UI
|
|
4
4
|
# I assume 24 lines height.
|
5
5
|
class CursesConsole < BaseUI
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
7
|
+
SET_LINE = 0
|
8
|
+
TITLE_LINE = 1
|
9
|
+
MOVES_LINE = 2
|
10
|
+
STATUS_LINE = 3
|
11
|
+
PICTURE_LINE = 5
|
12
12
|
|
13
13
|
def initialize
|
14
14
|
super()
|
@@ -18,13 +18,7 @@ module RSokoban::UI
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def get_action(hash)
|
21
|
-
|
22
|
-
@level_title = hash[:title]
|
23
|
-
@set_title = hash[:set]
|
24
|
-
@level_number = hash[:number]
|
25
|
-
@set_total = hash[:total]
|
26
|
-
Curses.clear
|
27
|
-
end
|
21
|
+
initialize_members_and_clear_screen hash
|
28
22
|
if [:display, :start].include?(hash[:type])
|
29
23
|
ask_player hash
|
30
24
|
else
|
@@ -35,6 +29,17 @@ module RSokoban::UI
|
|
35
29
|
|
36
30
|
private
|
37
31
|
|
32
|
+
def initialize_members_and_clear_screen hash
|
33
|
+
if hash[:type] == :start
|
34
|
+
@level_title = hash[:title]
|
35
|
+
@set_title = hash[:set]
|
36
|
+
@level_number = hash[:number]
|
37
|
+
@set_total = hash[:total]
|
38
|
+
@record = hash[:record]
|
39
|
+
Curses.clear
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
38
43
|
def init_screen
|
39
44
|
Curses.noecho # do not show typed keys
|
40
45
|
Curses.init_screen
|
@@ -43,12 +48,21 @@ module RSokoban::UI
|
|
43
48
|
end
|
44
49
|
|
45
50
|
def display hash
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
51
|
+
display_header hash[:move]
|
52
|
+
display_map hash[:map]
|
53
|
+
end
|
54
|
+
|
55
|
+
def display_header move_number
|
56
|
+
write SET_LINE, 0, "Set: #{@set_title}"
|
57
|
+
write TITLE_LINE, 0, "Level: #{@level_title} (#{@level_number}/#{@set_total}) Record: #{@record}"
|
58
|
+
write MOVES_LINE, 0, "moves : #{move_number} " unless move_number.nil?
|
59
|
+
write STATUS_LINE, 0, 'arrows=move (q)uit (r)etry (u)ndo (l)oad level/set'
|
60
|
+
end
|
61
|
+
|
62
|
+
def display_map map
|
63
|
+
line_num = PICTURE_LINE
|
64
|
+
map.each {|line|
|
65
|
+
line.gsub!(/o/, ' ')
|
52
66
|
write line_num, 0, line
|
53
67
|
line_num += 1
|
54
68
|
}
|
@@ -61,7 +75,7 @@ module RSokoban::UI
|
|
61
75
|
|
62
76
|
def ask_for_next_level hash
|
63
77
|
display hash
|
64
|
-
write
|
78
|
+
write STATUS_LINE, 0, "LEVEL COMPLETED ! Play next level ? (yes, no) "
|
65
79
|
case Curses.getch
|
66
80
|
when ?n, ?N then PlayerAction.new(:quit)
|
67
81
|
when ?y, ?Y then PlayerAction.new(:next)
|
@@ -96,8 +110,34 @@ module RSokoban::UI
|
|
96
110
|
end
|
97
111
|
|
98
112
|
def ask_level_or_set
|
113
|
+
show_cursor
|
114
|
+
display_help
|
115
|
+
response = Curses.getstr
|
116
|
+
hide_cursor
|
117
|
+
case response
|
118
|
+
when '1'..'999'
|
119
|
+
if response.to_i > @set_total
|
120
|
+
ask_level_or_set
|
121
|
+
else
|
122
|
+
PlayerAction.new(response.to_i)
|
123
|
+
end
|
124
|
+
when /\.xsb$/ then PlayerAction.new(response)
|
125
|
+
else
|
126
|
+
PlayerAction.new(:retry)
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
def show_cursor
|
99
131
|
Curses.curs_set 1
|
100
132
|
Curses.echo
|
133
|
+
end
|
134
|
+
|
135
|
+
def hide_cursor
|
136
|
+
Curses.curs_set 0
|
137
|
+
Curses.noecho
|
138
|
+
end
|
139
|
+
|
140
|
+
def display_help
|
101
141
|
Curses.clear
|
102
142
|
help=<<EOS
|
103
143
|
------------------------------------------------------------
|
@@ -109,20 +149,6 @@ Int 2 : type any letter to cancel and restart previous level
|
|
109
149
|
|
110
150
|
EOS
|
111
151
|
write 0, 0, help
|
112
|
-
str = Curses.getstr
|
113
|
-
Curses.curs_set 0
|
114
|
-
Curses.noecho
|
115
|
-
case str
|
116
|
-
when '1'..'999'
|
117
|
-
if str.to_i > @set_total
|
118
|
-
ask_level_or_set
|
119
|
-
else
|
120
|
-
PlayerAction.new(str.to_i)
|
121
|
-
end
|
122
|
-
when /\.xsb$/ then PlayerAction.new(str)
|
123
|
-
else
|
124
|
-
PlayerAction.new(:retry)
|
125
|
-
end
|
126
152
|
end
|
127
153
|
|
128
154
|
end
|
@@ -16,7 +16,7 @@ module RSokoban::UI
|
|
16
16
|
# @param [Object] the action
|
17
17
|
attr_reader :action
|
18
18
|
|
19
|
-
|
19
|
+
ALLOWED_SYMBOLS = [ :up, :down, :left, :right, :quit, :next, :retry, :undo ]
|
20
20
|
|
21
21
|
# You can look to {PlayerAction} for an allowed list of value.
|
22
22
|
# @param [Object] value optional initial action
|
@@ -33,15 +33,21 @@ module RSokoban::UI
|
|
33
33
|
# @param [Object] value the player action
|
34
34
|
# @raise ArgumentError if value is not allowed
|
35
35
|
def action=(value)
|
36
|
-
if value.instance_of?(Symbol)
|
37
|
-
|
38
|
-
end
|
39
|
-
if value.instance_of?(String)
|
40
|
-
raise ArgumentError unless value =~ /\.xsb$/
|
41
|
-
end
|
36
|
+
check_allowed_symbol(value) if value.instance_of?(Symbol)
|
37
|
+
check_allowed_string(value) if value.instance_of?(String)
|
42
38
|
@action = value
|
43
39
|
end
|
44
40
|
|
41
|
+
# @raise ArgumentError if value is not an allowed symbol
|
42
|
+
def check_allowed_symbol symb
|
43
|
+
raise ArgumentError unless ALLOWED_SYMBOLS.include?(symb)
|
44
|
+
end
|
45
|
+
|
46
|
+
# @raise ArgumentError if string is not an xsb filename
|
47
|
+
def check_allowed_string string
|
48
|
+
raise ArgumentError unless string =~ /\.xsb$/
|
49
|
+
end
|
50
|
+
|
45
51
|
def level_number?
|
46
52
|
@action.instance_of?(Fixnum)
|
47
53
|
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
require "yaml"
|
2
|
+
|
3
|
+
module RSokoban::UI
|
4
|
+
|
5
|
+
# @since 0.76
|
6
|
+
class Skin
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@path = File.join($RSOKOBAN_PATH, 'skins/')
|
10
|
+
@path_home = File.expand_path("~/.rsokoban/skins/")
|
11
|
+
@filenames = {}
|
12
|
+
end
|
13
|
+
|
14
|
+
def list_skins
|
15
|
+
dir = Dir.new @path
|
16
|
+
ret = []
|
17
|
+
dir.each do |item|
|
18
|
+
next if ['.', '..'].include? item
|
19
|
+
ret.push item
|
20
|
+
end
|
21
|
+
|
22
|
+
if File.exist? @path_home
|
23
|
+
dir = Dir.new @path_home
|
24
|
+
dir.each do |item|
|
25
|
+
next if ['.', '..'].include? item
|
26
|
+
ret.push item
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
ret.sort
|
31
|
+
end
|
32
|
+
|
33
|
+
def path_of_skin dirname
|
34
|
+
ret = File.join(@path, dirname)
|
35
|
+
return ret if File.directory? ret
|
36
|
+
ret = File.join(@path_home, dirname)
|
37
|
+
raise ArgumentError unless File.directory? ret
|
38
|
+
ret
|
39
|
+
end
|
40
|
+
|
41
|
+
def size_of full_path_dir
|
42
|
+
conf = YAML.load_file File.join(full_path_dir, 'skin.conf')
|
43
|
+
conf['size']
|
44
|
+
end
|
45
|
+
|
46
|
+
def filenames full_path_dir
|
47
|
+
@filenames = {}
|
48
|
+
get_other_filenames full_path_dir
|
49
|
+
get_man_filenames full_path_dir
|
50
|
+
get_man_on_storage_filenames full_path_dir
|
51
|
+
get_wall_filenames full_path_dir
|
52
|
+
@filenames
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
def get_other_filenames full_path_dir
|
58
|
+
images = [:crate, :floor, :store, :crate_store, :outside]
|
59
|
+
images.each do |image|
|
60
|
+
@filenames[image] = File.join(full_path_dir, image.to_s + '.bmp')
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def get_man_filenames full_path_dir
|
65
|
+
man_file = File.join(full_path_dir, 'man.bmp')
|
66
|
+
if File.exist?(man_file)
|
67
|
+
@filenames[:man_up] = @filenames[:man_down] = @filenames[:man_left] = @filenames[:man_right] = man_file
|
68
|
+
else
|
69
|
+
images = [:man_up, :man_down, :man_left, :man_right]
|
70
|
+
images.each do |image|
|
71
|
+
@filenames[image] = File.join(full_path_dir, image.to_s + '.bmp')
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def get_man_on_storage_filenames full_path_dir
|
77
|
+
man_file = File.join(full_path_dir, 'man_store.bmp')
|
78
|
+
if File.exist?(man_file)
|
79
|
+
@filenames[:man_store_up] = @filenames[:man_store_down] = @filenames[:man_store_left] = @filenames[:man_store_right] = man_file
|
80
|
+
else
|
81
|
+
images = [:man_store_up, :man_store_down, :man_store_left, :man_store_right]
|
82
|
+
images.each do |image|
|
83
|
+
@filenames[image] = File.join(full_path_dir, image.to_s + '.bmp')
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def get_wall_filenames full_path_dir
|
89
|
+
wall_test_file = File.join(full_path_dir, 'wall_d.bmp')
|
90
|
+
images = [:wall, :wall_d, :wall_dl, :wall_dlr, :wall_dr, :wall_l, :wall_lr, :wall_r,
|
91
|
+
:wall_u, :wall_ud, :wall_udl, :wall_udlr, :wall_udr, :wall_ul, :wall_ulr, :wall_ur]
|
92
|
+
if File.exist?(wall_test_file)
|
93
|
+
images.each do |image|
|
94
|
+
@filenames[image] = File.join(full_path_dir, image.to_s + '.bmp')
|
95
|
+
end
|
96
|
+
else
|
97
|
+
images.each do |image|
|
98
|
+
@filenames[image] = File.join(full_path_dir, 'wall.bmp')
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
end
|
104
|
+
|
105
|
+
end
|