empi 0.19 → 0.24

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,49 @@
1
+ LINE_HEIGHT = 20
2
+
3
+ # Score, turn and event texts
4
+ class Infopane
5
+ attr_reader :faction
6
+ attr_writer :cursor, :text
7
+
8
+ def initialize
9
+ @turn = 0
10
+ @faction = FACTIONS # so that FAC1 will be then the first active faction
11
+ @score = [0, 0]
12
+ @text = 'ready'
13
+ end
14
+
15
+ def update
16
+ end
17
+
18
+ def draw
19
+ freeroam_text = ""
20
+ freeroam_text = " (freeroam)" if (@cursor and @cursor.freeroam)
21
+
22
+ state = Gosu::Image.from_text(turnscore + freeroam_text, LINE_HEIGHT)
23
+ state.draw(XTEXT, YTEXT, ZTEXT)
24
+
25
+ text = Gosu::Image.from_text("#{@text}", LINE_HEIGHT)
26
+ text.draw(XTEXT, (TILESIZE / 2) + YTEXT, ZTEXT)
27
+ end
28
+
29
+ def turnscore
30
+ "Turn: #{@turn}, " \
31
+ "Faction: FAC#{@faction}, " \
32
+ "Score: #{@score[0]} - #{@score[1]}"
33
+ end
34
+
35
+ # Increment faction counter (modulo count of factions)
36
+ def next_faction!
37
+ @faction += 1
38
+ @faction = 1 if @faction > FACTIONS # marks the end of turn
39
+ end
40
+
41
+ # Increment turn counter
42
+ def next_turn!
43
+ @turn += 1
44
+ end
45
+
46
+ def add_score(to_whom, how_much)
47
+ @score[to_whom] += how_much
48
+ end
49
+ end
@@ -1,21 +1,31 @@
1
- SYMBOL_TOWN = 'T'
2
- SYMBOL_ARMY = 'A'
3
- SYMBOL_SHIP = 'S'
1
+ require_relative './tile'
2
+
3
+ require_relative './../units/army'
4
+ require_relative './../units/ship'
5
+ require_relative './../units/town'
4
6
 
5
7
  class Map
6
8
  attr_accessor :name, :mapx, :mapy, :infopane
7
9
 
8
- def initialize(infopane)
10
+ def initialize(file, infopane)
9
11
  dir_path = File.dirname(__FILE__)
10
12
 
11
13
  @infopane = infopane
12
- load_map(dir_path + '/save/m02.esf')
14
+ @known_unit_types = Hash[
15
+ [Army, Ship, Town].collect { |ii| [ii.map_symbol, ii] }
16
+ ]
17
+
18
+ load_map!(dir_path + "/../../save/#{file}.esf")
13
19
  end
14
20
 
15
21
  # Load map from file
16
- def load_map(filename)
17
- input = File.open(filename, 'r')
18
- unit_count = load_head(input.gets)
22
+ def load_map!(file_path)
23
+ unless File.file?(file_path)
24
+ abort("Map.load_map!(): File not found (#{file_path})")
25
+ end
26
+
27
+ input = File.open(file_path, 'r')
28
+ unit_count = load_head!(input.gets)
19
29
 
20
30
  # Load tiles
21
31
  @tiles = []
@@ -28,7 +38,7 @@ class Map
28
38
  }
29
39
 
30
40
  # Load units
31
- unit_count.times { load_unit(input.gets) }
41
+ unit_count.times { load_unit!(input.gets) }
32
42
 
33
43
  puts("Save loaded: #{@name} with #{unit_count} units")
34
44
  input.close
@@ -36,7 +46,7 @@ class Map
36
46
 
37
47
  # Load core info from given head row of file
38
48
  # Return number of units to be loaded
39
- def load_head(row)
49
+ def load_head!(row)
40
50
  head = []
41
51
  size = []
42
52
 
@@ -51,7 +61,7 @@ class Map
51
61
  end
52
62
 
53
63
  # Load one unit from given row
54
- def load_unit(row)
64
+ def load_unit!(row)
55
65
  unit = []
56
66
  coords = []
57
67
 
@@ -63,34 +73,30 @@ class Map
63
73
  coords_y = coords[1].to_i
64
74
  if (coords_x < 0 || coords_x >= @mapx ||
65
75
  coords_y < 0 || coords_y >= @mapy)
66
- abort("map.load_unit(): Unit out of map borders (#{coords_x}-#{coords_y})")
76
+ abort("map.load_unit!(): Unit out of map borders (#{coords_x}-#{coords_y})")
67
77
  end
68
78
 
69
79
  # Check faction
70
80
  fac = unit[1].to_i
71
81
  if(fac < 0 || fac > FACTIONS)
72
- abort("map.load_unit(): Bad faction id (#{fac})")
82
+ abort("map.load_unit!(): Bad faction id (#{fac})")
73
83
  end
74
84
 
75
85
  # 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)
86
+ unit_type = unit[0]
87
+ if @known_unit_types.include?(unit_type)
88
+ @known_unit_types[unit_type].new(coords_x, coords_y, fac, self, @infopane)
83
89
  else
84
- abort("map.load_unit(): Unknown unit type symbol (#{unit[0]})")
90
+ abort("map.load_unit!(): Unknown unit type symbol (#{unit_type})")
85
91
  end
86
92
  end
87
93
 
88
94
  # Draw all tiles
89
95
  def draw_tiles
90
- all_tiles.each { |tt| tt.draw} # TODO combine with draw_units() ?
96
+ all_tiles.each { |tt| tt.draw}
91
97
  end
92
98
 
93
- # Getter for tile in given coordinates
99
+ # Getter for tile at given coordinates
94
100
  def tile(cc, rr)
95
101
  @tiles[rr][cc]
96
102
  end
@@ -108,12 +114,12 @@ class Map
108
114
  ret
109
115
  end
110
116
 
111
- # Getter for unit in given coordinates
117
+ # Getter for unit at given coordinates
112
118
  def get_unit(cc, rr)
113
119
  @tiles[rr][cc].unit
114
120
  end
115
121
 
116
- # Setter for unit in given coordinates
122
+ # Setter for unit at given coordinates
117
123
  def set_unit(cc, rr, uu)
118
124
  @tiles[rr][cc].unit = uu
119
125
  end
@@ -0,0 +1,52 @@
1
+ TILE_SEA = 0
2
+ TILE_GROUND = 1
3
+
4
+ SYMBOL_SEA = '.'
5
+ SYMBOL_GROUND = '#'
6
+
7
+ class Tile
8
+ attr_accessor :terrain, :infopane, :unit
9
+
10
+ def initialize(x, y, loaded_symbol, infopane)
11
+ dir_path = File.dirname(__FILE__)
12
+
13
+ @x = x
14
+ @y = y
15
+ @infopane = infopane
16
+
17
+ case(loaded_symbol)
18
+ when SYMBOL_SEA then
19
+ @terrain = TILE_SEA
20
+ @image = Gosu::Image.new(dir_path + '/../../media/sea.png')
21
+ when SYMBOL_GROUND then
22
+ @terrain = TILE_GROUND
23
+ @image = Gosu::Image.new(dir_path + '/../../media/ground.png')
24
+ else
25
+ abort("tile.initialize(): Unknown terrain symbol (#{loaded_symbol})")
26
+ end
27
+ end
28
+
29
+ def draw
30
+ # 1) terrain
31
+ @image.draw(@x * TILESIZE, (@y + 1) * TILESIZE, ZTILE)
32
+
33
+ # 2) unit
34
+ if @unit
35
+ @unit.draw
36
+ end
37
+
38
+ # 3) axes
39
+ draw_axis_tick(@x, @y, 0) # TODO 0 -> viewport.y
40
+ draw_axis_tick(@y, @x, 0) # TODO 0 -> viewport.x
41
+ end
42
+
43
+ # Draw one tick of axis for appropriate tiles
44
+ def draw_axis_tick(draw_coord, test_coord, test_against)
45
+ # TODO appropriatness can be changed (show axes: no/top/left/bottom/right)
46
+ if test_coord == test_against
47
+ tick = Gosu::Image.from_text(draw_coord, 20)
48
+ tick.draw(@x * TILESIZE, (@y + 1) * TILESIZE, ZTEXT)
49
+ # ^^ TODO substract test_against of viewport from @x and @y here?
50
+ end
51
+ end
52
+ end
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.19'
4
+ version: '0.24'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Detros
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-12-04 00:00:00.000000000 Z
11
+ date: 2020-10-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: gosu
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: '0.9'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0'
26
+ version: '0.9'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -38,21 +38,31 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '10.0'
41
- description: 'Empi: Ruby Edition is a turn based wargame, currently deep in development.
42
- While learning Ruby I have found there are hardly any strategic games avaiable.
43
- So this should be Ruby version of Classic Empire, wargame from old times.'
41
+ description: |-
42
+ Empi: Ruby Edition is a turn-based wargame with hotseat
43
+ multiplayer, currently in alpha development state. The game is inspired by
44
+ Classic Empire, originally from 1977.
44
45
  email: rasunadon@seznam.cz
45
46
  executables: []
46
47
  extensions: []
47
48
  extra_rdoc_files: []
48
49
  files:
49
- - lib/army.rb
50
- - lib/cursor.rb
51
- - lib/docu/Empi v18.png
52
- - lib/docu/info.txt
53
50
  - lib/empi.rb
54
- - lib/infopane.rb
55
- - lib/map.rb
51
+ - lib/lib/game_states/build_state.rb
52
+ - lib/lib/game_states/game_state.rb
53
+ - lib/lib/game_states/play_state.rb
54
+ - lib/lib/game_states/quit_state.rb
55
+ - lib/lib/game_states/welcome_state.rb
56
+ - lib/lib/units/army.rb
57
+ - lib/lib/units/ship.rb
58
+ - lib/lib/units/town.rb
59
+ - lib/lib/units/unit.rb
60
+ - lib/lib/units/unitFunction.rb
61
+ - lib/lib/user_interface/cursor.rb
62
+ - lib/lib/user_interface/infopane.rb
63
+ - lib/lib/user_interface/map.rb
64
+ - lib/lib/user_interface/tile.rb
65
+ - lib/media/Empi v18.png
56
66
  - lib/media/army.png
57
67
  - lib/media/cursor.png
58
68
  - lib/media/ground.png
@@ -63,15 +73,15 @@ files:
63
73
  - lib/save/m02-err.esf
64
74
  - lib/save/m02.esf
65
75
  - lib/save/m03.esf
66
- - lib/ship.rb
67
- - lib/tile.rb
68
- - lib/town.rb
69
- - lib/unit.rb
70
- - lib/unitFunction.rb
71
76
  homepage: http://www.bay12forums.com/smf/index.php?topic=157538
72
77
  licenses:
73
78
  - CC-BY-SA-3.0
74
- metadata: {}
79
+ metadata:
80
+ source_code_uri: https://gitlab.com/rasunadon/empi
81
+ bug_tracker_uri: https://gitlab.com/rasunadon/empi/issues
82
+ documentation_uri: https://gitlab.com/rasunadon/empi/blob/master/README.md
83
+ changelog_uri: https://gitlab.com/rasunadon/empi/blob/master/CHANGELOG.md
84
+ homepage_uri: http://www.bay12forums.com/smf/index.php?topic=157538
75
85
  post_install_message:
76
86
  rdoc_options: []
77
87
  require_paths:
@@ -91,5 +101,5 @@ rubyforge_project:
91
101
  rubygems_version: 2.7.6
92
102
  signing_key:
93
103
  specification_version: 4
94
- summary: Turn-based wargame
104
+ summary: A turn-based wargame
95
105
  test_files: []
@@ -1,166 +0,0 @@
1
- class Cursor
2
- attr_accessor :x, :y, :freeroam, :unit
3
-
4
- def initialize(x, y, map, infopane)
5
- dir_path = File.dirname(__FILE__)
6
-
7
- @x = x
8
- @y = y
9
- @map = map
10
- @infopane = infopane
11
-
12
- @image = Gosu::Image.new(dir_path + '/media/cursor.png')
13
- @freeroam = false
14
-
15
- # to_next_unit! # get to the first one
16
- end
17
-
18
- def update(key)
19
- case key
20
- # Cardinal directions
21
- when Gosu::KbLeft, Gosu::KbA then
22
- move!(-1, 0) unless @x <= 0
23
- when Gosu::KbRight, Gosu::KbD then
24
- move!(1, 0) unless @x >= MAPX
25
- when Gosu::KbUp, Gosu::KbW then
26
- move!(0, -1) unless @y <= 0
27
- when Gosu::KbDown, Gosu::KbX then
28
- move!(0, 1) unless @y >= MAPY
29
-
30
- # Intercardinal directions
31
- when Gosu::KbQ then
32
- move!(-1, -1) unless @x <= 0 || @y <= 0
33
- when Gosu::KbE then
34
- move!(1, -1) unless @x >= MAPX || @y <= 0
35
- when Gosu::KbZ then
36
- move!(-1, 1) unless @x <= 0 || @y >= MAPY
37
- when Gosu::KbC then
38
- move!(1, 1) unless @x >= MAPX || @y >= MAPY
39
-
40
- # Functions
41
- when Gosu::KbS then
42
- set_function_to_unit(FUNCSENTRY)
43
- when Gosu::KbB then
44
- set_function_to_unit(FUNCBUILD)
45
- when Gosu::KbN then
46
- set_function_to_unit(FUNCNONE)
47
-
48
- when Gosu::KbReturn then
49
- info
50
- end
51
-
52
- # If in locked mode, stay at current/jump to next movable unit
53
- to_next_unit! unless freeroam
54
- end
55
-
56
- def draw
57
- @image.draw(@x * TILESIZE, (@y + 1) * TILESIZE, ZCURSOR)
58
- end
59
-
60
- # Move to coordinates of given unit
61
- def warp_to!(uu)
62
- @x = uu.x
63
- @y = uu.y
64
- @unit = uu
65
- end
66
-
67
- # Move by given change of coordinates
68
- def move!(xx, yy)
69
- if freeroam
70
- @x += xx
71
- @y += yy
72
- @unit = @map.get_unit(@x, @y)
73
- return
74
- end
75
-
76
- # If in locked mode
77
- if !@unit
78
- abort("cursor.move!(): Cursor is in locked mode but there is no unit it is locked to (at #{@x} - #{@y})")
79
- end
80
-
81
- @unit.x += xx
82
- @unit.y += yy
83
- @unit.check_movement(@x, @y) # cursor coordinates work like old_x, old_y
84
-
85
- uu = @map.get_unit(@unit.x, @unit.y)
86
- if !uu # it got destroyed
87
- @unit = nil # clear the last links so that (object of) given unit can be truly destroyed
88
- return
89
- end
90
-
91
- warp_to!(@unit) # whether it moved or not, unless it got destroyed
92
- end
93
-
94
- # Tries to set function <func> to currently selected unit
95
- def set_function_to_unit(func)
96
- if freeroam
97
- uu = @map.get_unit(@x, @y)
98
- else # in locked mode
99
- if !@unit
100
- abort("cursor.set_function_to_unit(): Cursor is in locked mode but there is no unit it is locked to (at #{@x} - #{@y})")
101
- end
102
- uu = @unit
103
- end
104
-
105
- uu.set_function!(func) unless !uu
106
- end
107
-
108
- # Find next unit to target with cursor
109
- def to_next_unit!
110
- unless @unit && @unit.can_move? && @unit.function == FUNCNONE # unless the current one is still movable
111
- movable_units = @map.all_units.select { |uu| uu.can_move? && uu.function == FUNCNONE}
112
-
113
- # If there are no more movable units without function, switch to freeroam mode
114
- if movable_units.size <= 0 # == would be enough
115
- puts 'all movable units without functions moved'
116
-
117
- switch_freeroam!
118
- return
119
- end
120
-
121
- @unit = movable_units[0] # newly selected one
122
- end
123
-
124
- warp_to!(@unit) # stay at old or go to new
125
- info
126
- end
127
-
128
- # Switch between being attached to unit and being able to freeroam
129
- def switch_freeroam!
130
- if freeroam
131
- @infopane.text = 'freeroam disabled'
132
- puts 'freeroam disabled'
133
- @freeroam = false
134
- to_next_unit!
135
- else
136
- @infopane.text = 'freeroam enabled'
137
- puts 'freeroam enabled'
138
- @freeroam = true
139
- @unit = nil
140
- end
141
- end
142
-
143
- # Find some info about units on the current tile
144
- def info
145
- if freeroam
146
- uu = @map.get_unit(@x, @y)
147
- else
148
- if !@unit
149
- abort("cursor.info(): Cursor is in locked mode but there is no unit it is locked to (at #{@x} - #{@y})")
150
- end
151
- uu = @unit
152
- end
153
-
154
- if uu
155
- @infopane.text = uu.info
156
- puts uu.info
157
-
158
- if uu.is_transporting?
159
- uu.cargo.each { |uu| puts '- cargo: ' + uu.info }
160
- end
161
- else
162
- @infopane.text = ''
163
- puts 'nothing here'
164
- end
165
- end
166
- end