empi 0.20 → 0.21

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f44b7fcbf8da0bfeb456b1aa7515b343466669b84ce1bbb758da28c08c18bd47
4
- data.tar.gz: 0d9da419f8352641e1a42829c38302b2306481a5c7015b7ed656c020980999e8
3
+ metadata.gz: c2a8c4d275198c690e2abe8ccaa6cc4fa6d636fa48a7aa5ddcf4cfd5e67a4e1b
4
+ data.tar.gz: 92d1bed4b5219e8ed122fa0abf5bb2065db2df87c6ac27698cc4c9c27750a935
5
5
  SHA512:
6
- metadata.gz: 905bf655272b2cb5b38fcd615b895a599b05376524cd5f904ee95fc4607f7d4a5f1edb4403bdade52dfb57bd8223a632f712de31b19cca38f0c06325edde65fa
7
- data.tar.gz: 4674d0c6c7ba49ec9fb559ccf8ff808ced32beb91863cdca1d0bbf26de9766d6257c150e3a69c0a3bf1d28fc9c84e803d6dd120b3d64b7a08fa3e4ddd175e61d
6
+ metadata.gz: 4c925aebb1925ccecbef7fa18e9bd1b18ec65d0066bfcd2b1ebc3e0f3476877c3f7b3dcd48f6d926057a85756591b70ec38d783134ba65e03b4436f9daf512dd
7
+ data.tar.gz: ab0dde3dd38a74a7639104601d6b972a824095f2b242acf81a5d8dc69b55e0be4eae0f3125f804b9106576c3cea185353b16ec0db1200d4c49ecf15c1dc67e80
@@ -1,13 +1,16 @@
1
1
  require_relative './unit'
2
2
 
3
3
  class Army < Unit
4
+ @name = 'army'
5
+ @map_symbol = 'A'
6
+ @price = 3
7
+ @value = 5
8
+
4
9
  def initialize(x, y, faction, map, infopane)
5
10
  super
6
11
  dir_path = File.dirname(__FILE__)
7
12
  @image = Gosu::Image.new(dir_path + '/media/army.png')
8
13
 
9
- @name = 'army'
10
- @value = 5
11
14
  @armor_left = @armor_max = 3
12
15
  @moves_max = 5
13
16
  end
@@ -0,0 +1,54 @@
1
+ require 'singleton'
2
+
3
+ require_relative './game_state'
4
+ require_relative './play_state'
5
+
6
+ require_relative './army'
7
+ require_relative './ship'
8
+
9
+ # Game state of closing the game window
10
+ class BuildState < GameState
11
+ include Singleton
12
+
13
+ attr_accessor :unit
14
+
15
+ # What to do just after state gets activated
16
+ #def after_start
17
+ #end
18
+
19
+ # What to do just before state gets deactivated
20
+ #def before_end
21
+ # TODO hide question?
22
+ #end
23
+
24
+ # Process given button to cursor
25
+ def update(button)
26
+ project = nil
27
+
28
+ case(button)
29
+ when Gosu::KbN, Gosu::KbEscape then
30
+ puts PROMPT + @unit.to_s + ": no project selected, resetting function"
31
+ @unit.set_function!(FUNCNONE)
32
+ GameState.switch!(PlayState.instance)
33
+ when Gosu::Kb1, Gosu::KbA then
34
+ project = Army
35
+ when Gosu::Kb2, Gosu::KbS then
36
+ project = Ship
37
+ end
38
+
39
+ # Did we get any proper answer?
40
+ if project
41
+ @unit.set_project!(project)
42
+ GameState.switch!(PlayState.instance)
43
+ end
44
+ end
45
+
46
+ def draw
47
+ build_project = Gosu::Image.from_text(
48
+ "Select the project for " + @unit.to_s + ":\n
49
+ 1, A – Army (3 turns)\n
50
+ 2, S – Ship (5 turns)\n\n
51
+ N, Esc – none\n", 20)
52
+ build_project.draw((2*TILESIZE) + XTEXT, (3*TILESIZE) + YTEXT, ZTEXT)
53
+ end
54
+ end
@@ -11,12 +11,10 @@ class Cursor
11
11
 
12
12
  @image = Gosu::Image.new(dir_path + '/media/cursor.png')
13
13
  @freeroam = false
14
-
15
- # to_next_unit! # get to the first one
16
14
  end
17
15
 
18
- def update(key)
19
- case key
16
+ def update(button)
17
+ case button
20
18
  # Cardinal directions
21
19
  when Gosu::KbLeft, Gosu::KbA, Gosu::KB_NUMPAD_4 then
22
20
  move!(-1, 0) unless @x <= 0
@@ -45,6 +43,9 @@ class Cursor
45
43
  when Gosu::KbN then
46
44
  set_function_to_unit(FUNCNONE)
47
45
 
46
+ # The rest
47
+ when Gosu::KbJ, Gosu::KB_NUMPAD_0 then
48
+ switch_freeroam!
48
49
  when Gosu::KbReturn, Gosu::KB_NUMPAD_5 then
49
50
  info
50
51
  end
@@ -1,113 +1,60 @@
1
1
  require 'rubygems'
2
2
  require 'gosu'
3
3
 
4
- require_relative './army'
5
- require_relative './cursor'
6
- require_relative './infopane'
7
- require_relative './map'
8
- require_relative './ship'
9
- require_relative './tile'
10
- require_relative './town'
4
+ require_relative './game_state'
5
+ require_relative './play_state'
11
6
 
12
7
  TILESIZE = 50
13
8
  MAPX = 10
14
9
  MAPY = 10
15
10
 
16
- XTEXT = 5
17
- YTEXT = 5
18
-
19
- ZTILE = 0
20
- ZUNIT = 1
21
- ZTEXT = 2
22
- ZCURSOR = 3
23
-
24
- FACTIONS = 2
25
- COLOUR = [0xff_ffffff, 0xff_ff3300, 0xff_ffcc00]
26
-
27
- FUNCNONE = 'none'
28
- FUNCSENTRY = 'sentry'
29
- FUNCBUILD = 'build'
30
-
31
11
  PROMPT = '> '
12
+ BUTTON_PROCESSED = -1
32
13
 
33
14
  # Main class
34
15
  class GameWindow < Gosu::Window
16
+ attr_accessor :state
17
+
35
18
  def initialize(width = (MAPX + 1) * TILESIZE, \
36
19
  height = (MAPY + 2) * TILESIZE, \
37
20
  fullscreen = false)
38
21
  super
39
- self.caption = 'Empi: Ruby Edition 0.20 dev'
22
+ self.caption = 'Empi: Ruby Edition 0.21 dev'
40
23
 
41
- @infopane = Infopane.new
42
- @map = Map.new(@infopane)
43
- @cursor = Cursor.new(0, 0, @map, @infopane)
44
- help # show help after loading of map
45
- new_turn
24
+ # Activate first state
25
+ $window = self
26
+ GameState.switch!(PlayState.instance)
46
27
  end
47
28
 
29
+ # Catch the released button
48
30
  def button_up(key)
49
31
  @button = key
50
32
  end
51
33
 
52
- # Process given button to cursor
34
+ # Process given button according to current state
53
35
  def update
54
- case(@button)
55
- when -1, nil then # no keys pressed (yet)
56
- return
57
- when Gosu::KbEscape then
58
- close
59
- when Gosu::KbPeriod then
60
- new_turn
61
- when Gosu::KbH then
62
- help
63
- when Gosu::KbJ, Gosu::KB_NUMPAD_0 then
64
- @cursor.switch_freeroam!
65
- else
66
- @cursor.update(@button)
36
+ # No (new) keys
37
+ unless @button == BUTTON_PROCESSED || @button.nil?
38
+ @state.update(@button)
67
39
  end
68
40
  end
69
41
 
70
42
  # Draw only after some button was released and in the start
71
43
  def needs_redraw?
72
- @button != -1
44
+ @button != BUTTON_PROCESSED
73
45
  end
74
46
 
47
+ # Draw according to current state
75
48
  def draw
76
- @button = -1 # draw just once after each button press
77
-
78
- @map.draw_tiles
79
- @cursor.draw
80
- @infopane.draw
81
-
82
- # DEBUG @map.all_units.each { |uu| puts uu.info}
83
- end
84
-
85
- # End current turn and start the next one
86
- def new_turn
87
- puts "=============\n" \
88
- "End of turn\n" \
89
- "=============\n"
90
-
91
- functionable_units = @map.all_units.select { |uu| uu.function != FUNCNONE}
92
- functionable_units.each { |uu| uu.function! }
93
-
94
- @map.all_units.each { |uu| uu.reset_moves!}
95
- @infopane.next_turn
96
49
 
97
- @cursor.freeroam = true
98
- @cursor.switch_freeroam! # so freeroam = false, with messages
99
- end
100
-
101
- def help
102
- puts "-----------\n" \
103
- "h: help, Esc: end game, Enter: info, j: switch freeroam\n" \
104
- "QWEADZXC or arrow keys: movement, .: end turn\n" \
105
- "functions: s sentry, b build, n none\n" \
106
- "-----------\n"
50
+ @button = BUTTON_PROCESSED # draw just once after each button release
51
+ unless $window.state.nil?
52
+ @state.draw
53
+ end
107
54
  end
108
55
  end
109
56
 
110
57
  # ---------------------------------------------------------------
111
58
 
112
- window = GameWindow.new
113
- window.show
59
+ $window = GameWindow.new
60
+ $window.show
@@ -0,0 +1,34 @@
1
+ require 'singleton'
2
+
3
+ require_relative './game_state'
4
+ require_relative './play_state'
5
+
6
+ # Game state of closing the game window
7
+ class EscapeState < GameState
8
+ include Singleton
9
+
10
+ # What to do just after state gets activated
11
+ #def after_start
12
+ #end
13
+
14
+ # What to do just before state gets deactivated
15
+ #def before_end
16
+ # TODO hide question?
17
+ #end
18
+
19
+ # Process given button to cursor
20
+ def update(button)
21
+ case(button)
22
+ when Gosu::KbY then
23
+ $window.close
24
+ when Gosu::KbN, Gosu::KbEscape then
25
+ GameState.switch!(PlayState.instance) # TODO return to state that called you
26
+ end
27
+ end
28
+
29
+ def draw
30
+ confirmation = Gosu::Image.from_text(
31
+ "Are you sure you want to quit? Y/N", 20)
32
+ confirmation.draw((3*TILESIZE) + XTEXT, (4*TILESIZE) + YTEXT, ZTEXT)
33
+ end
34
+ end
@@ -0,0 +1,27 @@
1
+ # Managing of active game states
2
+ class GameState
3
+ # Switch active state to next one
4
+ def self.switch!(next_state)
5
+ #puts 'DEBUG: switching to state ' + next_state.to_s
6
+
7
+ unless $window.state.nil?
8
+ $window.state.before_end
9
+ end
10
+ $window.state = next_state
11
+ $window.state.after_start
12
+ end
13
+
14
+ # What to do just after state gets activated
15
+ def after_start
16
+ end
17
+
18
+ # What to do just before state gets deactivated
19
+ def before_end
20
+ end
21
+
22
+ def update(button)
23
+ end
24
+
25
+ def draw
26
+ end
27
+ end
data/lib/map.rb CHANGED
@@ -1,6 +1,7 @@
1
- SYMBOL_TOWN = 'T'
2
- SYMBOL_ARMY = 'A'
3
- SYMBOL_SHIP = 'S'
1
+ require_relative './army'
2
+ require_relative './ship'
3
+ require_relative './tile'
4
+ require_relative './town'
4
5
 
5
6
  class Map
6
7
  attr_accessor :name, :mapx, :mapy, :infopane
@@ -9,6 +10,11 @@ class Map
9
10
  dir_path = File.dirname(__FILE__)
10
11
 
11
12
  @infopane = infopane
13
+ @known_unit_types = Hash[
14
+ [Army, Ship, Town].collect { |ii| [ii.map_symbol, ii] }
15
+ ]
16
+
17
+ # TODO selectable starting scenario
12
18
  load_map(dir_path + '/save/m02.esf')
13
19
  end
14
20
 
@@ -73,24 +79,20 @@ class Map
73
79
  end
74
80
 
75
81
  # Create unit
76
- case(unit[0])
77
- when SYMBOL_TOWN then
78
- Town.new(coords_x, coords_y, fac, self, @infopane)
79
- when SYMBOL_ARMY then
80
- Army.new(coords_x, coords_y, fac, self, @infopane)
81
- when SYMBOL_SHIP then
82
- Ship.new(coords_x, coords_y, fac, self, @infopane)
82
+ unit_type = unit[0]
83
+ if @known_unit_types.include?(unit_type)
84
+ @known_unit_types[unit_type].new(coords_x, coords_y, fac, self, @infopane)
83
85
  else
84
- abort("map.load_unit(): Unknown unit type symbol (#{unit[0]})")
86
+ abort("map.load_unit(): Unknown unit type symbol (#{unit_type})")
85
87
  end
86
88
  end
87
89
 
88
90
  # Draw all tiles
89
91
  def draw_tiles
90
- all_tiles.each { |tt| tt.draw} # TODO combine with draw_units() ?
92
+ all_tiles.each { |tt| tt.draw}
91
93
  end
92
94
 
93
- # Getter for tile in given coordinates
95
+ # Getter for tile at given coordinates
94
96
  def tile(cc, rr)
95
97
  @tiles[rr][cc]
96
98
  end
@@ -108,12 +110,12 @@ class Map
108
110
  ret
109
111
  end
110
112
 
111
- # Getter for unit in given coordinates
113
+ # Getter for unit at given coordinates
112
114
  def get_unit(cc, rr)
113
115
  @tiles[rr][cc].unit
114
116
  end
115
117
 
116
- # Setter for unit in given coordinates
118
+ # Setter for unit at given coordinates
117
119
  def set_unit(cc, rr, uu)
118
120
  @tiles[rr][cc].unit = uu
119
121
  end
@@ -0,0 +1,98 @@
1
+ require 'singleton'
2
+
3
+ require_relative './game_state'
4
+ require_relative './escape_state'
5
+
6
+ require_relative './cursor'
7
+ require_relative './infopane'
8
+ require_relative './map'
9
+
10
+
11
+ XTEXT = 5
12
+ YTEXT = 5
13
+ ZTILE = 0
14
+ ZUNIT = 1
15
+ ZTEXT = 2
16
+ ZCURSOR = 3
17
+
18
+ FACTIONS = 2
19
+ COLOUR = [0xff_ffffff, 0xff_ff3300, 0xff_ffcc00]
20
+
21
+ FUNCNONE = 'none'
22
+ FUNCSENTRY = 'sentry'
23
+ FUNCBUILD = 'build'
24
+
25
+ # Game state of main gameplay
26
+ class PlayState < GameState
27
+ include Singleton
28
+
29
+ # Load new scenario or resume game
30
+ def after_start
31
+ unless @infopane and @map and @cursor # is everything set up yet?
32
+ @infopane = Infopane.new
33
+ @map = Map.new(@infopane)
34
+ @cursor = Cursor.new(0, 0, @map, @infopane)
35
+ help # show help after loading of map
36
+ new_turn
37
+ else
38
+ # Remind player the current status
39
+ if @cursor.freeroam
40
+ @infopane.text = 'freeroam is enabled'
41
+ puts 'freeroam is enabled'
42
+ else
43
+ @cursor.info
44
+ end
45
+ end
46
+ end
47
+
48
+ # What to do just before state gets deactivated
49
+ #def before_end
50
+ # TODO undraw all parts?
51
+ #end
52
+
53
+ # Process given button or send it to cursor
54
+ def update(button)
55
+ case(button)
56
+ when Gosu::KbEscape then
57
+ GameState.switch!(EscapeState.instance)
58
+ when Gosu::KbPeriod then
59
+ new_turn
60
+ when Gosu::KbH then
61
+ help
62
+ else
63
+ @cursor.update(button)
64
+ end
65
+ end
66
+
67
+ # Draw all parts of main window
68
+ def draw
69
+ @map.draw_tiles
70
+ @cursor.draw
71
+ @infopane.draw
72
+ end
73
+
74
+ # End current turn and start the next one
75
+ def new_turn
76
+ puts "=============\n" \
77
+ "End of turn\n" \
78
+ "=============\n"
79
+
80
+ functionable_units = @map.all_units.select { |uu| uu.function != FUNCNONE}
81
+ functionable_units.each { |uu| uu.function! }
82
+
83
+ @map.all_units.each { |uu| uu.reset_moves!}
84
+ @infopane.next_turn
85
+
86
+ @cursor.freeroam = true
87
+ @cursor.switch_freeroam! # so freeroam = false, with messages
88
+ end
89
+
90
+ # Printout the controls
91
+ def help
92
+ puts "-----------\n" \
93
+ "h: help, Esc: end game, Enter: info, j: switch freeroam\n" \
94
+ "QWEADZXC or arrow keys: movement, .: end turn\n" \
95
+ "functions: s sentry, b build, n none\n" \
96
+ "-----------\n"
97
+ end
98
+ end
@@ -1,13 +1,16 @@
1
1
  require_relative './unit'
2
2
 
3
3
  class Ship < Unit
4
+ @name = 'ship'
5
+ @map_symbol = 'S'
6
+ @price = 5
7
+ @value = 10
8
+
4
9
  def initialize(x, y, faction, map, infopane)
5
10
  super
6
11
  dir_path = File.dirname(__FILE__)
7
12
  @image = Gosu::Image.new(dir_path + '/media/ship.png')
8
13
 
9
- @name = 'ship'
10
- @value = 10
11
14
  @armor_left = @armor_max = 1
12
15
  @moves_max = 2
13
16
  @cargo_max = 3
@@ -1,6 +1,15 @@
1
+ require_relative './game_state'
2
+ require_relative './build_state'
3
+
4
+ require_relative './army'
5
+ require_relative './ship'
1
6
  require_relative './unit'
2
7
 
3
8
  class Town < Unit
9
+ @name = 'town'
10
+ @map_symbol = 'T'
11
+ @value = 20
12
+
4
13
  attr_accessor :project, :parts_built, :parts_needed
5
14
 
6
15
  def initialize(x, y, faction, map, infopane)
@@ -8,12 +17,11 @@ class Town < Unit
8
17
  dir_path = File.dirname(__FILE__)
9
18
  @image = Gosu::Image.new(dir_path + '/media/town.png')
10
19
 
11
- @name = 'town'
12
- @value = 20
13
20
  @armor_left = @armor_max = 1
14
21
  @moves_max = 0
15
22
  @cargo_max = 10
16
23
 
24
+ @starting_project = Army unless @faction == 0
17
25
  @project = nil
18
26
  @parts_built = 0
19
27
  @parts_needed = 0
@@ -48,29 +56,44 @@ class Town < Unit
48
56
  def set_function!(func)
49
57
  super
50
58
 
51
- if @faction != 0 and func == FUNCBUILD # neutral towns don't need projects either
52
- set_project!
59
+ if @faction != 0 and func == FUNCBUILD # neutral towns don't need projects
60
+ # Set once starting project or ask player about next project
61
+ if @starting_project
62
+ set_project!(@starting_project)
63
+ @starting_project = nil
64
+ else
65
+ GameState.switch!(BuildState.instance)
66
+ BuildState.instance.unit = self
67
+ end
53
68
  end
54
69
  end
55
70
 
56
71
  # Set desired project
57
- def set_project!
58
- @desired_project = "army" # TODO ask for input on what to build
59
- @parts_needed = 3 # TODO load from given project class
72
+ def set_project!(desired_project)
73
+ # Figure out the price
74
+ prices = Hash[
75
+ [Army, Ship].collect { |ii| [ii, ii.price] } # TODO all subclasses of Unit which can_be_built?
76
+ ]
77
+
78
+ unless prices.key?(desired_project)
79
+ abort("town.set_project!(): Unknown project (#{desired_project})")
80
+ end
81
+ @parts_needed = prices[desired_project]
60
82
 
61
- if @desired_project == @project
62
- puts PROMPT + to_s + ": project has already been set to #{@project} (#{build_info} done)"
83
+ # Compare new setting with the old one
84
+ if desired_project == @project
85
+ puts PROMPT + to_s + ": project has already been set to #{@project.name} (#{build_info} done)"
63
86
  else
64
87
  previous_project = @project
65
- @project = @desired_project
88
+ @project = desired_project
66
89
  lost_parts = @parts_built
67
90
  @parts_built = 0
68
91
 
69
- new_project_set_text = PROMPT + to_s + ": project set to #{@project} (#{build_info} done)"
92
+ new_project_set_text = PROMPT + to_s + ": project set to #{@project.name} (#{build_info} done)"
70
93
  unless lost_parts > 0
71
94
  puts new_project_set_text
72
95
  else
73
- puts new_project_set_text + ", losing #{lost_parts} parts of #{previous_project} "
96
+ puts new_project_set_text + ", losing #{lost_parts} parts of #{previous_project.name} "
74
97
  end
75
98
  end
76
99
  end
@@ -1,9 +1,11 @@
1
1
  require_relative './unitFunction'
2
2
 
3
- PARTS_TO_BE_BUILT = 0
4
-
5
3
  # Both capturable and movable game pieces
6
4
  class Unit
5
+ class << self
6
+ attr_reader :name, :map_symbol, :price, :value
7
+ end
8
+
7
9
  attr_accessor :x, :y, :faction, :function, :cargo
8
10
 
9
11
  def initialize(x, y, faction, map, infopane)
@@ -13,8 +15,6 @@ class Unit
13
15
  @map = map
14
16
  @infopane = infopane
15
17
 
16
- @name = 'unit'
17
- @value = 1
18
18
  @armor_max = 1
19
19
  @armor_left = @armor_max
20
20
  @moves_max = 1
@@ -72,7 +72,7 @@ class Unit
72
72
  end
73
73
 
74
74
  # Add <value> to the capturing faction
75
- @infopane.add_score(by_whom - 1, @value)
75
+ @infopane.add_score(by_whom - 1, self.class.value)
76
76
  @faction = by_whom
77
77
  end
78
78
 
@@ -81,7 +81,7 @@ class Unit
81
81
  # If you are transporting somebody, destroy them first
82
82
  @cargo.each { |uu| uu.destroy! }
83
83
 
84
- @infopane.add_score(3 - @faction - 1, @value) # TODO more factions?
84
+ @infopane.add_score(3 - @faction - 1, self.class.value) # TODO more factions?
85
85
 
86
86
  if is_transported?
87
87
  coords_unit = @map.get_unit(@x, @y)
@@ -182,7 +182,7 @@ class Unit
182
182
  end
183
183
 
184
184
  def can_be_built?
185
- PARTS_TO_BE_BUILT > 0
185
+ self.class.price > 0
186
186
  end
187
187
 
188
188
  def can_transport?
@@ -250,7 +250,7 @@ class Unit
250
250
 
251
251
  # Set short info string: type, faction, coordinates
252
252
  def to_s
253
- "#{@name} (FAC#{@faction} #{@x}-#{@y})"
253
+ "#{self.class.name} (FAC#{@faction} #{@x}-#{@y})"
254
254
  end
255
255
 
256
256
  # Set long info string: short info string, armor, moves, function, cargo
@@ -12,7 +12,7 @@ class UnitFunction
12
12
  when FUNCNONE
13
13
  "no function"
14
14
  when FUNCBUILD
15
- "building #{@unit.project} (#{@unit.build_info})"
15
+ "building #{@unit.project.name} (#{@unit.build_info})"
16
16
  when FUNCSENTRY
17
17
  "sentrying"
18
18
  end
@@ -27,11 +27,11 @@ class UnitFunction
27
27
  @unit.parts_built += 1
28
28
 
29
29
  unless @unit.parts_built >= @unit.parts_needed # just == should be enough
30
- ret = " built next part of #{@unit.project} (#{@unit.build_info} done)"
30
+ ret = " built next part of #{@unit.project.name} (#{@unit.build_info} done)"
31
31
  else
32
- ret = " completed building of #{@unit.project}"
32
+ ret = " completed building of #{@unit.project.name}"
33
33
  @unit.parts_built = 0
34
- Army.new(@unit.x, @unit.y, @unit.faction, map, infopane)
34
+ @unit.project.new(@unit.x, @unit.y, @unit.faction, map, infopane)
35
35
  end
36
36
 
37
37
  # Wake when enemies are nearby
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: empi
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.20'
4
+ version: '0.21'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Detros
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-01-25 00:00:00.000000000 Z
11
+ date: 2020-02-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: gosu
@@ -47,8 +47,11 @@ extensions: []
47
47
  extra_rdoc_files: []
48
48
  files:
49
49
  - lib/army.rb
50
+ - lib/build_state.rb
50
51
  - lib/cursor.rb
51
52
  - lib/empi.rb
53
+ - lib/escape_state.rb
54
+ - lib/game_state.rb
52
55
  - lib/infopane.rb
53
56
  - lib/map.rb
54
57
  - lib/media/Empi v18.png
@@ -58,6 +61,7 @@ files:
58
61
  - lib/media/sea.png
59
62
  - lib/media/ship.png
60
63
  - lib/media/town.png
64
+ - lib/play_state.rb
61
65
  - lib/save/m01.esf
62
66
  - lib/save/m02-err.esf
63
67
  - lib/save/m02.esf