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
@@ -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
@@ -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
@@ -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
- end
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
- blankConsole = "\n" * 24 # assuming a console window of 24 lines height
34
- puts blankConsole
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
- unless hash[:move].nil?
39
- puts "move #{hash[:move]}"
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
- hash[:map].each {|line| puts line }
60
+ map.each {|line|
61
+ line.gsub!(/o/, ' ')
62
+ puts line
63
+ }
45
64
  puts ''
46
65
  end
47
66
 
48
- def ask_for_next_level
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 ask_player
59
- printf "Your choice ? "
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 : #{line}"
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
- ask_player
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
- @@SET_LINE = 0
8
- @@TITLE_LINE = 1
9
- @@MOVES_LINE = 2
10
- @@STATUS_LINE = 3
11
- @@PICTURE_LINE = 5
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
- if hash[:type] == :start
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
- write @@SET_LINE, 0, "Set: #{@set_title}"
47
- write @@TITLE_LINE, 0, "Level: #{@level_title} (#{@level_number}/#{@set_total})"
48
- write @@MOVES_LINE, 0, "moves : #{hash[:move].to_s} " unless hash[:move].nil?
49
- write @@STATUS_LINE, 0, 'arrows=move (q)uit (r)etry (u)ndo (l)oad level/set'
50
- line_num = @@PICTURE_LINE
51
- hash[:map].each {|line|
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 @@STATUS_LINE, 0, "LEVEL COMPLETED ! Play next level ? (yes, no) "
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
- @@Allowed_symbols = [ :up, :down, :left, :right, :quit, :next, :retry, :undo ]
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
- raise ArgumentError unless @@Allowed_symbols.include?(value)
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