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
data/lib/rsokoban/ui.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require "rsokoban/ui/base_ui"
2
2
  require "rsokoban/ui/player_action"
3
+ require "rsokoban/ui/skin"
3
4
 
4
5
  module RSokoban
5
6
 
data/lib/rsokoban.rb CHANGED
@@ -1,12 +1,11 @@
1
1
  require "rsokoban/extensions"
2
2
  require "rsokoban/level"
3
- require "rsokoban/level_loader"
3
+ require "rsokoban/set_loader"
4
4
  require "rsokoban/exception"
5
5
  require "rsokoban/position"
6
6
  require "rsokoban/man"
7
7
  require "rsokoban/crate"
8
8
  require "rsokoban/storage"
9
- require "rsokoban/game"
10
9
  require "rsokoban/option"
11
10
  require "rsokoban/level_set"
12
11
  require "rsokoban/raw_level"
@@ -14,6 +13,11 @@ require "rsokoban/ui"
14
13
  require "rsokoban/move_recorder"
15
14
  require "rsokoban/map"
16
15
  require "rsokoban/move_result"
16
+ require "rsokoban/game"
17
+ require "rsokoban/layered_map"
18
+ require "rsokoban/record"
19
+ require "rsokoban/install"
20
+ require "rsokoban/config"
17
21
 
18
22
  # I am the main module of the game.
19
23
  module RSokoban
@@ -26,5 +30,13 @@ module RSokoban
26
30
  WALL = '#'
27
31
  MAN_ON_STORAGE = '+'
28
32
  CRATE_ON_STORAGE = '*'
33
+ OUTSIDE = 'o'
34
+
35
+ # config files will go in this folder
36
+ CONFIG_FOLDER = File.expand_path "~/.rsokoban"
37
+ # primary config file
38
+ CONFIG_FILE = 'config'
29
39
 
40
+ # Record files will go in this folder
41
+ RECORD_FOLDER = File.expand_path "~/.rsokoban/record"
30
42
  end
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,3 @@
1
+ author: Gerry Wiseman
2
+ license: unknown
3
+ size: 30
Binary file
Binary file
Binary file
@@ -0,0 +1,3 @@
1
+ author: MerlijnVV
2
+ license: unknown
3
+ size: 30
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,3 @@
1
+ author: Gerry Wiseman
2
+ license: unknown
3
+ size: 35
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,2 @@
1
+ 1: 200
2
+ 22: 321
data/test/tc_game.rb CHANGED
@@ -1,28 +1,37 @@
1
1
  class TC_Game < Test::Unit::TestCase
2
-
2
+ include RSokoban
3
+
4
+ class GameFake
5
+ include RSokoban::Game
6
+ end
7
+
3
8
  def setup
4
9
  $RSOKOBAN_DATA_PATH = File.expand_path(File.dirname(__FILE__))
5
- @game = RSokoban::Game.new :portable, 'original.xsb'
6
- # Make Game@ui nil to not start the ui.
7
- @game.instance_variable_set(:@ui, nil)
8
- # Load the first level, without starting ui (see previous line)
9
- @game.start_level
10
+ @level_set_name = 'original.xsb'
11
+ @game = GameFake.new('Fake UI', @level_set_name)
10
12
  end
11
13
 
12
- def test_level_width
13
- assert_equal 19, @game.level_width
14
+ def test_game_is_not_instanciable
15
+ assert_raise(NoMethodError) do
16
+ ins = Game.new
17
+ end
14
18
  end
15
19
 
16
- def test_level_height
17
- assert_equal 11, @game.level_height
20
+ def test_run_method_must_failed
21
+ assert_raise(NotImplementedError) do
22
+ @game.run
23
+ end
18
24
  end
19
25
 
20
- def test_level_title
21
- assert_equal '1', @game.level_title
26
+ def test_start_level_method_must_failed
27
+ assert_raise(NotImplementedError) do
28
+ @game.start_level
29
+ end
22
30
  end
23
31
 
24
- def test_man_x
25
- assert_equal 11, @game.man_x
26
- end
32
+ # must create a fake config file to test this
33
+ #~ def test_level_number_is_initialized_to_1
34
+ #~ assert_equal 1, @game.level_number
35
+ #~ end
27
36
 
28
37
  end
@@ -0,0 +1,40 @@
1
+ class TC_GameFactory < Test::Unit::TestCase
2
+ include RSokoban
3
+
4
+ def setup
5
+ $RSOKOBAN_DATA_PATH = File.expand_path(File.dirname(__FILE__))
6
+ @level_set_name = 'original.xsb'
7
+ end
8
+
9
+ def test_create_with_wrong_argument
10
+ assert_raise(ArgumentError) do
11
+ game = GameFactory.create String
12
+ end
13
+ end
14
+
15
+ def test_method_new_is_not_allowed
16
+ assert_raise(NoMethodError) do
17
+ gf = GameFactory.new
18
+ end
19
+ end
20
+
21
+ def test_create_a_game_with_portable_ui
22
+ game = GameFactory.create(GamePortable, 'Fake UI', @level_set_name)
23
+ assert_equal GamePortable, game.class
24
+ end
25
+
26
+ def test_create_a_game_with_curses_ui
27
+ game = GameFactory.create(GameCurses, 'Fake UI', @level_set_name)
28
+ assert_equal GameCurses, game.class
29
+ end
30
+
31
+ def test_create_a_game_with_tk_gui
32
+ # tk is normally requiered from the bin/rsokoban program.
33
+ require 'tk'
34
+ game = GameFactory.create(GameTk, 'Fake UI', @level_set_name)
35
+ assert_equal GameTk, game.class
36
+ end
37
+
38
+
39
+
40
+ end
@@ -0,0 +1,26 @@
1
+ class TC_GameGUI < Test::Unit::TestCase
2
+ include RSokoban
3
+
4
+ class GameFake
5
+ include RSokoban::GameGUI
6
+ end
7
+
8
+ class UIFake
9
+ end
10
+
11
+ def setup
12
+ $RSOKOBAN_DATA_PATH = File.expand_path(File.dirname(__FILE__))
13
+ @level_set_name = 'original.xsb'
14
+ @ui = UIFake.new
15
+ # initialize a game
16
+ @game = GameFake.new(@ui, @level_set_name)
17
+ @game.start_level
18
+ end
19
+
20
+ def test_game_ui_is_not_instanciable
21
+ assert_raise(NoMethodError) do
22
+ ins = GameGUI.new
23
+ end
24
+ end
25
+
26
+ end
@@ -0,0 +1,153 @@
1
+ # @todo find something to test the run method
2
+ class TC_GameUI < Test::Unit::TestCase
3
+ include RSokoban
4
+
5
+ class GameFake
6
+ include RSokoban::GameUI
7
+ end
8
+
9
+ class UIFake
10
+ def get_action(hash)
11
+ RSokoban::UI::PlayerAction.new :quit
12
+ end
13
+ end
14
+
15
+ def setup
16
+ $RSOKOBAN_DATA_PATH = File.expand_path(File.dirname(__FILE__))
17
+ @level_set_name = 'original.xsb'
18
+ @ui = UIFake.new
19
+ # initialize a game
20
+ @game = GameFake.new(@ui, @level_set_name)
21
+ @game.start_level
22
+ end
23
+
24
+ def test_game_ui_is_not_instanciable
25
+ assert_raise(NoMethodError) do
26
+ ins = GameUI.new
27
+ end
28
+ end
29
+
30
+ def test_start_level_must_return_an_action
31
+ game = GameFake.new(@ui, @level_set_name)
32
+ assert_equal UI::PlayerAction, game.start_level.class
33
+ end
34
+
35
+ def test_run_method_must_respond_to_the_quit_command
36
+ game = GameFake.new(@ui, @level_set_name)
37
+ game.start_level
38
+ assert_equal true, game.run
39
+ end
40
+
41
+ ### Test module Game trough module GameUI ####################################
42
+
43
+ # must create a fake config file to test this
44
+ #~ def test_level_width
45
+ #~ assert_equal 19, @game.level_width
46
+ #~ end
47
+
48
+ # must create a fake config file to test this
49
+ #~ def test_level_height
50
+ #~ assert_equal 11, @game.level_height
51
+ #~ end
52
+
53
+ # must create a fake config file to test this
54
+ #~ def test_level_title
55
+ #~ assert_equal '1', @game.level_title
56
+ #~ end
57
+
58
+ def test_map_as_array_must_return_an_array
59
+ assert_equal Array, @game.map_as_array.class
60
+ end
61
+
62
+ # must create a fake config file to test this
63
+ #~ def test_man_x
64
+ #~ assert_equal 11, @game.man_x
65
+ #~ end
66
+
67
+ # must create a fake config file to test this
68
+ #~ def test_man_y
69
+ #~ assert_equal 8, @game.man_y
70
+ #~ end
71
+
72
+ def test_move_must_return_move_result
73
+ game = GameFake.new(@ui, @level_set_name)
74
+ game.start_level
75
+ assert_equal MoveResult, game.move(:up).class
76
+ end
77
+
78
+ def test_initial_move_number_must_be_zero
79
+ assert_equal 0, @game.move_number
80
+ end
81
+
82
+ # must create a fake config file to test this
83
+ #~ def test_move_number
84
+ #~ game = GameFake.new(@ui, @level_set_name)
85
+ #~ game.start_level
86
+ #~ game.move(:up)
87
+ #~ assert_equal 1, game.move_number
88
+ #~ end
89
+
90
+ def test_undo_must_return_move_result
91
+ game = GameFake.new(@ui, @level_set_name)
92
+ game.start_level
93
+ assert_equal MoveResult, game.undo.class
94
+ end
95
+
96
+ def test_redo_must_return_move_result
97
+ game = GameFake.new(@ui, @level_set_name)
98
+ game.start_level
99
+ assert_equal MoveResult, game.undo.class
100
+ end
101
+
102
+ def test_title_of_the_set
103
+ assert_equal 'Original & Extra', @game.set_title
104
+ end
105
+
106
+ def test_size_of_the_set
107
+ assert_equal 90, @game.set_size
108
+ end
109
+
110
+ # must create a fake config file to test this
111
+ #~ def test_next_level
112
+ #~ game = GameFake.new(@ui, @level_set_name)
113
+ #~ game.start_level
114
+ #~ game.next_level
115
+ #~ assert_equal 2, game.level_number
116
+ #~ end
117
+
118
+ def test_load_level
119
+ game = GameFake.new(@ui, @level_set_name)
120
+ game.start_level
121
+ game.load_level 3
122
+ assert_equal 3, game.level_number
123
+ end
124
+
125
+ def test_restart_set
126
+ game = GameFake.new(@ui, @level_set_name)
127
+ game.start_level
128
+ game.load_level 3
129
+ game.restart_set
130
+ assert_equal 1, game.level_number
131
+ end
132
+
133
+ def test_load_a_set_that_doesnt_exist
134
+ game = GameFake.new(@ui, @level_set_name)
135
+ game.start_level
136
+ game.load_a_new_set 'doesnt_exist.xsb'
137
+ # assert nothing has changed
138
+
139
+ # must create a fake config file to test this
140
+ #~ assert_equal 1, game.level_number
141
+
142
+ assert_equal 'Original & Extra', game.set_title
143
+ end
144
+
145
+ def test_load_a_set_of_levels
146
+ game = GameFake.new(@ui, @level_set_name)
147
+ game.start_level
148
+ game.load_a_new_set 'test_file2.xsb'
149
+ assert_equal 1, game.level_number
150
+ assert_equal 'another test file', game.set_title
151
+ end
152
+
153
+ end
@@ -0,0 +1,12 @@
1
+ class TC_Install< Test::Unit::TestCase
2
+ include RSokoban
3
+
4
+ def test_create_folder
5
+ Install.create_folder 'temp/record'
6
+ assert File.exist? 'temp/record'
7
+ assert File.directory? 'temp/record'
8
+ ensure
9
+ FileUtils.remove_dir('temp') if File.exist?('temp')
10
+ end
11
+
12
+ end
@@ -0,0 +1,105 @@
1
+ class TC_LayeredMap < Test::Unit::TestCase
2
+ include RSokoban
3
+
4
+ MAP_1 = [ '####',
5
+ '#..#',
6
+ '#$$#',
7
+ '#@ #',
8
+ '####']
9
+
10
+ MAP_2 = [ '####',
11
+ '#*.#',
12
+ '# $#',
13
+ '#@ #',
14
+ '####']
15
+
16
+ FLOOR_1 = [ '####',
17
+ '# #',
18
+ '# #',
19
+ '# #',
20
+ '####']
21
+ def setup
22
+ map = Map.new MAP_1
23
+ @lay_map = LayeredMap.new(map)
24
+ end
25
+
26
+ def test_must_be_initialized_from_map_or_array_of_string
27
+ assert_raise(ArgumentError) do
28
+ @lay_map = LayeredMap.new('a string')
29
+ end
30
+ end
31
+
32
+ def test_floor
33
+ assert_equal FLOOR_1, @lay_map.floor
34
+ end
35
+
36
+ def test_man_position
37
+ man = @lay_map.man
38
+ assert_equal 1, man.x
39
+ assert_equal 3, man.y
40
+ end
41
+
42
+ def test_storages_positions
43
+ store = Storage.new(1, 1)
44
+ assert_equal true, @lay_map.storages.include?(store)
45
+
46
+ store = Storage.new(2, 1)
47
+ assert_equal true, @lay_map.storages.include?(store)
48
+ end
49
+
50
+ def test_crates_position
51
+ crate = Crate.new(1, 2)
52
+ assert_equal true, @lay_map.crates.include?(crate)
53
+
54
+ crate = Crate.new(2, 2)
55
+ assert_equal true, @lay_map.crates.include?(crate)
56
+ end
57
+
58
+ def test_map_as_array
59
+ assert_equal MAP_1, @lay_map.map_as_array
60
+ end
61
+
62
+ def test_expected_wall
63
+ assert_equal WALL, @lay_map.what_is_on(0, 0)
64
+ end
65
+
66
+ def test_expected_floor
67
+ assert_equal FLOOR, @lay_map.what_is_on(2, 3)
68
+ end
69
+
70
+ def test_expected_crate
71
+ assert_equal CRATE, @lay_map.what_is_on(1, 2)
72
+ end
73
+
74
+ def test_expected_storage
75
+ assert_equal STORAGE, @lay_map.what_is_on(1, 1)
76
+ end
77
+
78
+ def test_expected_crate_on_storage
79
+ lay_map = LayeredMap.new(Map.new(MAP_2))
80
+ assert_equal CRATE_ON_STORAGE, lay_map.what_is_on(1, 1)
81
+ end
82
+
83
+ ### BUGS #################################################
84
+
85
+ MAP_BUG_9 = [
86
+ '####',
87
+ '#$+#',
88
+ '# #',
89
+ '####']
90
+
91
+ # Some levels crashes (like microban.xsb #101) because they contain man on storage in its map.
92
+ def test_bug_9_man_on_storage
93
+ map = Map.new MAP_BUG_9
94
+ lay_map = LayeredMap.new(map)
95
+
96
+ man = lay_map.man
97
+ assert_equal 2, man.x
98
+ assert_equal 1, man.y
99
+
100
+ assert_equal STORAGE, lay_map.what_is_on(2, 1)
101
+
102
+ assert_equal CRATE, lay_map.what_is_on(1, 1)
103
+ end
104
+
105
+ end