empi 0.22.3 → 0.23
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 +4 -4
- data/lib/empi.rb +3 -3
- data/lib/lib/game_states/build_state.rb +1 -1
- data/lib/lib/game_states/play_state.rb +57 -22
- data/lib/lib/game_states/{escape_state.rb → quit_state.rb} +3 -4
- data/lib/lib/game_states/welcome_state.rb +64 -0
- data/lib/lib/units/town.rb +4 -4
- data/lib/lib/units/unit.rb +32 -15
- data/lib/lib/user_interface/cursor.rb +79 -63
- data/lib/lib/user_interface/infopane.rb +21 -10
- data/lib/lib/user_interface/map.rb +15 -12
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d7a7e44ce8aebd925aac9b87c2344c2ddfb75dc7e12b2d2d61d584c6c4ca2477
|
4
|
+
data.tar.gz: edc23d080b7c85249fd869b4571c6c42eff315a2a5ddee93720b5f7c9aa09004
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 22293eedf9f530feafdc018936a37399c2c4ac975c65e00f4b32ffa4c27a79e912d1e2c5e3d0189d464b348b8f0aebc9b5c2955f7b616daadd813afc9f6e5a11
|
7
|
+
data.tar.gz: 4701285d5bb8aa354afd9d766e4b2012489822aaa0e3c59cc3c6b9ae6f9cb3a7c61ab521d142e425bfb582c6fa2c6ef86dc10a5fdb1a785a03ecf2de4a97c4f9
|
data/lib/empi.rb
CHANGED
@@ -2,7 +2,7 @@ require 'rubygems'
|
|
2
2
|
require 'gosu'
|
3
3
|
|
4
4
|
require_relative './lib/game_states/game_state'
|
5
|
-
require_relative './lib/game_states/
|
5
|
+
require_relative './lib/game_states/welcome_state'
|
6
6
|
|
7
7
|
TILESIZE = 50
|
8
8
|
MAPX = 10
|
@@ -19,11 +19,11 @@ class GameWindow < Gosu::Window
|
|
19
19
|
height = (MAPY + 2) * TILESIZE, \
|
20
20
|
fullscreen = false)
|
21
21
|
super
|
22
|
-
self.caption = 'Empi: Ruby Edition 0.
|
22
|
+
self.caption = 'Empi: Ruby Edition 0.23'
|
23
23
|
|
24
24
|
# Activate first state
|
25
25
|
$window = self
|
26
|
-
GameState.switch!(
|
26
|
+
GameState.switch!(WelcomeState.instance)
|
27
27
|
end
|
28
28
|
|
29
29
|
# Catch the released button
|
@@ -52,7 +52,7 @@ class BuildState < GameState
|
|
52
52
|
# If "none" project was selected reset also the function
|
53
53
|
def reset_function!()
|
54
54
|
puts PROMPT + @unit.to_s + ": no project selected, resetting function"
|
55
|
-
@unit.set_function!(FUNCNONE)
|
55
|
+
@unit.set_function!(FUNCNONE, @unit.faction)
|
56
56
|
GameState.switch!(PlayState.instance)
|
57
57
|
end
|
58
58
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'singleton'
|
2
2
|
|
3
3
|
require_relative './game_state'
|
4
|
-
require_relative './
|
4
|
+
require_relative './welcome_state'
|
5
5
|
|
6
6
|
require_relative './../user_interface/cursor'
|
7
7
|
require_relative './../user_interface/infopane'
|
@@ -26,15 +26,24 @@ FUNCBUILD = 'build'
|
|
26
26
|
class PlayState < GameState
|
27
27
|
include Singleton
|
28
28
|
|
29
|
+
attr_reader :map
|
30
|
+
attr_writer :desired_new_map
|
31
|
+
|
29
32
|
# Load new scenario or resume game
|
30
33
|
def after_start
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
@
|
35
|
-
|
36
|
-
|
34
|
+
if @desired_new_map
|
35
|
+
load_new_map!
|
36
|
+
help # show help after each loading of a new map
|
37
|
+
@desired_new_map = nil
|
38
|
+
|
39
|
+
next_faction_turn! # so FAC1 will be the first active faction, with announcement
|
37
40
|
else
|
41
|
+
# Make sure everything is set up
|
42
|
+
unless @infopane and @map and @cursor
|
43
|
+
abort("PlayState.after_start(): Map parts are not properly loaded
|
44
|
+
(#{@infopane}, #{@map}, #{@cursor})")
|
45
|
+
end
|
46
|
+
|
38
47
|
@cursor.info_stopped = false
|
39
48
|
|
40
49
|
# Remind player the current status
|
@@ -56,9 +65,9 @@ class PlayState < GameState
|
|
56
65
|
def update(button)
|
57
66
|
case(button)
|
58
67
|
when Gosu::KbEscape then
|
59
|
-
GameState.switch!(
|
68
|
+
GameState.switch!(WelcomeState.instance)
|
60
69
|
when Gosu::KbPeriod then
|
61
|
-
|
70
|
+
next_faction_turn!
|
62
71
|
when Gosu::KbH then
|
63
72
|
help
|
64
73
|
else
|
@@ -73,27 +82,53 @@ class PlayState < GameState
|
|
73
82
|
@infopane.draw
|
74
83
|
end
|
75
84
|
|
76
|
-
#
|
77
|
-
def
|
78
|
-
puts
|
79
|
-
"
|
80
|
-
"
|
85
|
+
# Load the desired map
|
86
|
+
def load_new_map!
|
87
|
+
puts("=============\n" \
|
88
|
+
"=============\n" \
|
89
|
+
"Loading save: #{@desired_new_map}")
|
90
|
+
@infopane = Infopane.new
|
91
|
+
@map = Map.new(@desired_new_map, @infopane)
|
92
|
+
@cursor = Cursor.new(0, 0, @map, @infopane)
|
93
|
+
end
|
94
|
+
|
95
|
+
# End turn of the active faction
|
96
|
+
def next_faction_turn!
|
97
|
+
@infopane.next_faction!
|
98
|
+
|
99
|
+
# Have all factions played this turn so we are now back at the first one?
|
100
|
+
if @infopane.faction == 1
|
101
|
+
puts "=============\n" \
|
102
|
+
"End of turn\n" \
|
103
|
+
"=============\n"
|
104
|
+
@infopane.next_turn!
|
105
|
+
end
|
106
|
+
|
107
|
+
# Announce game state at the start of turn of the next faction
|
108
|
+
# TODO add change-of-active-faction screen
|
109
|
+
puts "-----------\n" + @infopane.turnscore
|
81
110
|
|
82
|
-
|
83
|
-
|
111
|
+
# Activate functions and reset moves for units of the next faction
|
112
|
+
functionable_faction_units = @map.all_units.select { |uu|
|
113
|
+
uu.faction == @infopane.faction and
|
114
|
+
uu.function != FUNCNONE
|
115
|
+
}
|
116
|
+
functionable_faction_units.each { |uu| uu.function! }
|
84
117
|
|
85
|
-
@map.all_units.
|
86
|
-
|
118
|
+
all_faction_units = @map.all_units.select { |uu|
|
119
|
+
uu.faction == @infopane.faction
|
120
|
+
}
|
121
|
+
all_faction_units.each { |uu| uu.reset_moves!}
|
87
122
|
|
88
|
-
|
89
|
-
@cursor.
|
123
|
+
# Lock the cursor to the first waiting unit
|
124
|
+
@cursor.reset!
|
90
125
|
end
|
91
126
|
|
92
127
|
# Printout the controls
|
93
128
|
def help
|
94
129
|
puts "-----------\n" \
|
95
|
-
"h: help, Esc:
|
96
|
-
"QWEADZXC or arrow keys: movement, .: end turn\n" \
|
130
|
+
"h: help, Esc: menu, Enter: info, j: switch freeroam\n" \
|
131
|
+
"QWEADZXC or arrow keys: movement, .: end your turn\n" \
|
97
132
|
"functions: s sentry, b build, n none\n" \
|
98
133
|
"-----------\n"
|
99
134
|
end
|
@@ -1,10 +1,10 @@
|
|
1
1
|
require 'singleton'
|
2
2
|
|
3
3
|
require_relative './game_state'
|
4
|
-
require_relative './
|
4
|
+
require_relative './welcome_state'
|
5
5
|
|
6
6
|
# Game state of closing the game window
|
7
|
-
class
|
7
|
+
class QuitState < GameState
|
8
8
|
include Singleton
|
9
9
|
|
10
10
|
# What to do just after state gets activated
|
@@ -13,7 +13,6 @@ class EscapeState < GameState
|
|
13
13
|
|
14
14
|
# What to do just before state gets deactivated
|
15
15
|
#def before_end
|
16
|
-
# TODO hide question?
|
17
16
|
#end
|
18
17
|
|
19
18
|
# Process given button to cursor
|
@@ -22,7 +21,7 @@ class EscapeState < GameState
|
|
22
21
|
when Gosu::KbY then
|
23
22
|
$window.close
|
24
23
|
when Gosu::KbN, Gosu::KbEscape then
|
25
|
-
GameState.switch!(
|
24
|
+
GameState.switch!(WelcomeState.instance)
|
26
25
|
end
|
27
26
|
end
|
28
27
|
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
|
3
|
+
require_relative './game_state'
|
4
|
+
require_relative './play_state'
|
5
|
+
require_relative './quit_state'
|
6
|
+
|
7
|
+
# Game state of closing the game window
|
8
|
+
class WelcomeState < GameState
|
9
|
+
include Singleton
|
10
|
+
|
11
|
+
# What to do just after state gets activated
|
12
|
+
#def after_start
|
13
|
+
#end
|
14
|
+
|
15
|
+
# What to do just before state gets deactivated
|
16
|
+
#def before_end
|
17
|
+
#end
|
18
|
+
|
19
|
+
# Process given button to cursor
|
20
|
+
def update(button)
|
21
|
+
case(button)
|
22
|
+
when Gosu::Kb0, Gosu::KbQ then
|
23
|
+
GameState.switch!(QuitState.instance)
|
24
|
+
when Gosu::KbEscape then
|
25
|
+
if PlayState.instance.map
|
26
|
+
GameState.switch!(PlayState.instance)
|
27
|
+
end
|
28
|
+
when Gosu::Kb1, Gosu::Kb2, Gosu::Kb3 then
|
29
|
+
PlayState.instance.desired_new_map = {
|
30
|
+
Gosu::Kb1 => 'm01',
|
31
|
+
Gosu::Kb2 => 'm02',
|
32
|
+
Gosu::Kb3 => 'm03'
|
33
|
+
}[button]
|
34
|
+
GameState.switch!(PlayState.instance)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def draw
|
39
|
+
header_text = '
|
40
|
+
/-- /// /-/ -/-
|
41
|
+
/-- ||| /-/ |
|
42
|
+
/-- ||| | -/-'
|
43
|
+
|
44
|
+
if PlayState.instance.map # some map is loaded
|
45
|
+
space_text = "\n\n\n"
|
46
|
+
options_text = "
|
47
|
+
Esc – Resume"
|
48
|
+
else
|
49
|
+
space_text = "\n\n\n\n"
|
50
|
+
options_text = ""
|
51
|
+
end
|
52
|
+
|
53
|
+
options_text += "
|
54
|
+
1 – Start New: Map 01
|
55
|
+
2 – Start New: Map 02
|
56
|
+
3 – Start New: Map 03\n
|
57
|
+
0, Q – Quit"
|
58
|
+
|
59
|
+
menu = Gosu::Image.from_text(
|
60
|
+
header_text + space_text + options_text, 20)
|
61
|
+
|
62
|
+
menu.draw((3*TILESIZE) + XTEXT, (2*TILESIZE) + YTEXT, ZTEXT)
|
63
|
+
end
|
64
|
+
end
|
data/lib/lib/units/town.rb
CHANGED
@@ -26,7 +26,7 @@ class Town < Unit
|
|
26
26
|
@parts_built = 0
|
27
27
|
@parts_needed = 0
|
28
28
|
|
29
|
-
set_function!(FUNCBUILD) unless @faction == 0
|
29
|
+
set_function!(FUNCBUILD, @faction) unless @faction == 0
|
30
30
|
end
|
31
31
|
|
32
32
|
def can_build?
|
@@ -51,14 +51,14 @@ class Town < Unit
|
|
51
51
|
@project = nil
|
52
52
|
@parts_built = 0
|
53
53
|
|
54
|
-
set_function!(FUNCBUILD)
|
54
|
+
set_function!(FUNCBUILD, @faction)
|
55
55
|
end
|
56
56
|
|
57
57
|
# Set desired function and possibly also project
|
58
|
-
def set_function!(func)
|
58
|
+
def set_function!(func, commanding_faction)
|
59
59
|
super
|
60
60
|
|
61
|
-
if @faction != 0 and
|
61
|
+
if @faction != 0 and commanding_faction == @faction and func == FUNCBUILD
|
62
62
|
# Set starting project once or ask player about next project
|
63
63
|
if @starting_project
|
64
64
|
set_project!(@starting_project)
|
data/lib/lib/units/unit.rb
CHANGED
@@ -6,6 +6,7 @@ class Unit
|
|
6
6
|
attr_reader :name, :map_symbol, :price, :value
|
7
7
|
end
|
8
8
|
|
9
|
+
attr_reader :armor_left
|
9
10
|
attr_accessor :x, :y, :faction, :function, :cargo, :cargo_max
|
10
11
|
|
11
12
|
def initialize(x, y, faction, map, infopane)
|
@@ -78,6 +79,8 @@ class Unit
|
|
78
79
|
|
79
80
|
# Add <value> to the other faction and remove links to given unit
|
80
81
|
def destroy!
|
82
|
+
@armor_left = 0 # for non-attack damage
|
83
|
+
|
81
84
|
# If you are transporting somebody, destroy them first
|
82
85
|
@cargo.each { |uu| uu.destroy! }
|
83
86
|
|
@@ -160,12 +163,17 @@ class Unit
|
|
160
163
|
end
|
161
164
|
end
|
162
165
|
|
163
|
-
|
164
166
|
def draw
|
165
167
|
@image.draw(@x * TILESIZE, (@y + 1) * TILESIZE, ZUNIT,
|
166
168
|
scale_x = 1, scale_y = 1, color = COLOUR[@faction])
|
167
169
|
end
|
168
170
|
|
171
|
+
def is_waiting_for_commands?
|
172
|
+
@faction == @infopane.faction and
|
173
|
+
function == FUNCNONE and
|
174
|
+
can_move?
|
175
|
+
end
|
176
|
+
|
169
177
|
def can_move?
|
170
178
|
(can_fly? || can_sail? || can_ride?) && @moves_left > 0
|
171
179
|
end
|
@@ -232,22 +240,31 @@ class Unit
|
|
232
240
|
end
|
233
241
|
|
234
242
|
# Set desired function
|
235
|
-
def set_function!(func)
|
243
|
+
def set_function!(func, commanding_faction)
|
244
|
+
# Check your neutrality
|
236
245
|
if @faction == 0
|
237
|
-
puts PROMPT + to_s + ": neutral
|
238
|
-
|
239
|
-
|
240
|
-
puts PROMPT + to_s + ": this unit can't build other units"
|
241
|
-
return
|
242
|
-
end
|
246
|
+
puts PROMPT + to_s + ": neutral units can't have functions set"
|
247
|
+
return
|
248
|
+
end
|
243
249
|
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
250
|
+
# Check origin of command
|
251
|
+
if commanding_faction != @faction
|
252
|
+
puts PROMPT + to_s + ": this unit does not take commands from other factions"
|
253
|
+
return
|
254
|
+
end
|
255
|
+
|
256
|
+
# Check your abilities
|
257
|
+
if func == FUNCBUILD and !can_build?
|
258
|
+
puts PROMPT + to_s + ": this unit can't build other units"
|
259
|
+
return
|
260
|
+
end
|
261
|
+
|
262
|
+
# Check current function and set the new one
|
263
|
+
if @function.func == func
|
264
|
+
puts PROMPT + to_s + ": function is already set to #{@function.func}"
|
265
|
+
else
|
266
|
+
@function.func = func
|
267
|
+
puts PROMPT + to_s + ": function set to #{@function.func}"
|
251
268
|
end
|
252
269
|
end
|
253
270
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
class Cursor
|
2
|
-
attr_accessor :
|
2
|
+
attr_accessor :freeroam, :info_stopped
|
3
3
|
|
4
4
|
def initialize(x, y, map, infopane)
|
5
5
|
dir_path = File.dirname(__FILE__)
|
@@ -12,6 +12,12 @@ class Cursor
|
|
12
12
|
@image = Gosu::Image.new(dir_path + '/../../media/cursor.png')
|
13
13
|
@freeroam = false
|
14
14
|
@info_stopped = false
|
15
|
+
|
16
|
+
# Give to Infopane link to yourself (for freeroam marker)
|
17
|
+
if !@infopane
|
18
|
+
abort("Cursor.initialize!(): Infopane is not set")
|
19
|
+
end
|
20
|
+
@infopane.cursor = self
|
15
21
|
end
|
16
22
|
|
17
23
|
def update(button)
|
@@ -41,7 +47,7 @@ class Cursor
|
|
41
47
|
set_function_to_unit(FUNCSENTRY)
|
42
48
|
when Gosu::KbB then
|
43
49
|
set_function_to_unit(FUNCBUILD)
|
44
|
-
|
50
|
+
when Gosu::KbN then
|
45
51
|
set_function_to_unit(FUNCNONE)
|
46
52
|
|
47
53
|
# The rest
|
@@ -52,18 +58,18 @@ class Cursor
|
|
52
58
|
end
|
53
59
|
|
54
60
|
# If in locked mode, stay at current/jump to next movable unit
|
55
|
-
to_next_unit! unless freeroam
|
61
|
+
to_next_unit! unless @freeroam
|
56
62
|
end
|
57
63
|
|
58
64
|
def draw
|
59
65
|
@image.draw(@x * TILESIZE, (@y + 1) * TILESIZE, ZCURSOR)
|
60
66
|
end
|
61
67
|
|
62
|
-
# Move to coordinates of
|
63
|
-
def
|
64
|
-
@x =
|
65
|
-
@y =
|
66
|
-
@
|
68
|
+
# Move to coordinates of unit the cursor is locked to
|
69
|
+
def warp_to_locked!()
|
70
|
+
@x = @locked_to.x
|
71
|
+
@y = @locked_to.y
|
72
|
+
@local_unit = @locked_to
|
67
73
|
end
|
68
74
|
|
69
75
|
# Move by given change of coordinates
|
@@ -71,94 +77,104 @@ class Cursor
|
|
71
77
|
if freeroam
|
72
78
|
@x += xx
|
73
79
|
@y += yy
|
74
|
-
@
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
80
|
+
@local_unit = @map.get_unit(@x, @y)
|
81
|
+
else
|
82
|
+
check_unit
|
83
|
+
|
84
|
+
# Move the unit first
|
85
|
+
@locked_to.x += xx
|
86
|
+
@locked_to.y += yy
|
87
|
+
@locked_to.check_movement(@x, @y) # cursor coordinates work like old_x, old_y
|
88
|
+
|
89
|
+
# Is the unit still alive?
|
90
|
+
if @locked_to.armor_left > 0
|
91
|
+
warp_to_locked! # whether it moved or not
|
92
|
+
else
|
93
|
+
# It got destroyed so clear last links then so that (object of)
|
94
|
+
# given unit can be truly destroyed
|
95
|
+
@local_unit = nil
|
96
|
+
@locked_to = nil
|
97
|
+
end
|
81
98
|
end
|
99
|
+
end
|
82
100
|
|
83
|
-
|
84
|
-
|
85
|
-
|
101
|
+
# Tries to set function <func> to local unit
|
102
|
+
def set_function_to_unit(func)
|
103
|
+
check_unit
|
86
104
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
105
|
+
if @local_unit
|
106
|
+
@local_unit.set_function!(func, @infopane.faction)
|
107
|
+
else
|
108
|
+
puts "no unit to set that function to (at #{@x}-#{@y})"
|
91
109
|
end
|
92
|
-
|
93
|
-
warp_to!(@unit) # whether it moved or not, unless it got destroyed
|
94
110
|
end
|
95
111
|
|
96
|
-
#
|
97
|
-
def
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
end
|
104
|
-
uu = @unit
|
105
|
-
end
|
106
|
-
|
107
|
-
uu.set_function!(func) unless !uu
|
112
|
+
# Reset to locked mode
|
113
|
+
def reset!
|
114
|
+
@freeroam = true
|
115
|
+
switch_freeroam!
|
116
|
+
@local_unit = nil
|
117
|
+
@locked_to = nil
|
118
|
+
to_next_unit!
|
108
119
|
end
|
109
120
|
|
110
|
-
# Find next unit
|
121
|
+
# Find next unit which is still waiting for commands and lock to it
|
122
|
+
# (local -> last locked to -> next waiting) or switch (back) to freeroaming
|
111
123
|
def to_next_unit!
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
124
|
+
if @local_unit and @local_unit.is_waiting_for_commands?
|
125
|
+
# Lock to such unit (though it may have already been locked)
|
126
|
+
@locked_to = @local_unit
|
127
|
+
else
|
128
|
+
unless @locked_to and @locked_to.is_waiting_for_commands?
|
129
|
+
waiting = @map.all_units.select { |uu| uu.is_waiting_for_commands? }
|
130
|
+
|
131
|
+
# Are there still some units of active faction waiting for commands?
|
132
|
+
if waiting.size <= 0 # == would be enough
|
133
|
+
puts 'all movable units without functions moved'
|
134
|
+
switch_freeroam!
|
135
|
+
return
|
136
|
+
end
|
118
137
|
|
119
|
-
|
120
|
-
return
|
138
|
+
@locked_to = waiting[0] # newly selected one
|
121
139
|
end
|
122
|
-
|
123
|
-
@unit = movable_units[0] # newly selected one
|
124
140
|
end
|
125
141
|
|
126
|
-
|
142
|
+
warp_to_locked! # stay at old or go to new
|
127
143
|
info unless @info_stopped # due to switching out of the play game state
|
128
144
|
end
|
129
145
|
|
146
|
+
# When cursor is in locked mode there needs to be a local unit it is locked to
|
147
|
+
# When cursor is in freeroam mode the local unit should still be loaded
|
148
|
+
def check_unit
|
149
|
+
if !@freeroam and !@local_unit
|
150
|
+
abort("cursor.set_function_to_unit(): Cursor is in locked mode " \
|
151
|
+
"but there is no unit it is locked to (at #{@x}-#{@y})")
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
130
155
|
# Switch between being attached to unit and being able to freeroam
|
131
156
|
def switch_freeroam!
|
132
157
|
if freeroam
|
133
158
|
@infopane.text = 'freeroam disabled'
|
134
159
|
puts 'freeroam disabled'
|
135
160
|
@freeroam = false
|
136
|
-
to_next_unit!
|
137
161
|
else
|
138
162
|
@infopane.text = 'freeroam enabled'
|
139
163
|
puts 'freeroam enabled'
|
140
164
|
@freeroam = true
|
141
|
-
@unit = nil
|
142
165
|
end
|
143
166
|
end
|
144
167
|
|
145
168
|
# Find some info about units on the current tile
|
146
169
|
def info
|
147
|
-
|
148
|
-
uu = @map.get_unit(@x, @y)
|
149
|
-
else
|
150
|
-
if !@unit
|
151
|
-
abort("cursor.info(): Cursor is in locked mode but there is no unit it is locked to (at #{@x} - #{@y})")
|
152
|
-
end
|
153
|
-
uu = @unit
|
154
|
-
end
|
170
|
+
check_unit
|
155
171
|
|
156
|
-
|
157
|
-
@infopane.text =
|
158
|
-
puts
|
172
|
+
unless !@local_unit
|
173
|
+
@infopane.text = @local_unit.info
|
174
|
+
puts @local_unit.info
|
159
175
|
|
160
|
-
if
|
161
|
-
|
176
|
+
if @local_unit.is_transporting?
|
177
|
+
@local_unit.cargo.each { |uu| puts '- cargo: ' + uu.info }
|
162
178
|
end
|
163
179
|
else
|
164
180
|
@infopane.text = ''
|
@@ -2,12 +2,13 @@ LINE_HEIGHT = 20
|
|
2
2
|
|
3
3
|
# Score, turn and event texts
|
4
4
|
class Infopane
|
5
|
-
|
5
|
+
attr_reader :faction
|
6
|
+
attr_writer :cursor, :text
|
6
7
|
|
7
8
|
def initialize
|
8
|
-
@score = [0, 0]
|
9
9
|
@turn = 0
|
10
|
-
@
|
10
|
+
@faction = FACTIONS # so that FAC1 will be then the first active faction
|
11
|
+
@score = [0, 0]
|
11
12
|
@text = 'ready'
|
12
13
|
end
|
13
14
|
|
@@ -15,21 +16,31 @@ class Infopane
|
|
15
16
|
end
|
16
17
|
|
17
18
|
def draw
|
18
|
-
|
19
|
-
|
20
|
-
|
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)
|
21
24
|
|
22
25
|
text = Gosu::Image.from_text("#{@text}", LINE_HEIGHT)
|
23
26
|
text.draw(XTEXT, (TILESIZE / 2) + YTEXT, ZTEXT)
|
24
27
|
end
|
25
28
|
|
26
|
-
def
|
27
|
-
#
|
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
|
28
39
|
end
|
29
40
|
|
30
|
-
|
41
|
+
# Increment turn counter
|
42
|
+
def next_turn!
|
31
43
|
@turn += 1
|
32
|
-
puts "Turn: #{@turn}, Score: #{@score[0]} - #{@score[1]}"
|
33
44
|
end
|
34
45
|
|
35
46
|
def add_score(to_whom, how_much)
|
@@ -7,7 +7,7 @@ require_relative './../units/town'
|
|
7
7
|
class Map
|
8
8
|
attr_accessor :name, :mapx, :mapy, :infopane
|
9
9
|
|
10
|
-
def initialize(infopane)
|
10
|
+
def initialize(file, infopane)
|
11
11
|
dir_path = File.dirname(__FILE__)
|
12
12
|
|
13
13
|
@infopane = infopane
|
@@ -15,14 +15,17 @@ class Map
|
|
15
15
|
[Army, Ship, Town].collect { |ii| [ii.map_symbol, ii] }
|
16
16
|
]
|
17
17
|
|
18
|
-
|
19
|
-
load_map(dir_path + '/../../save/m02.esf')
|
18
|
+
load_map!(dir_path + "/../../save/#{file}.esf")
|
20
19
|
end
|
21
20
|
|
22
21
|
# Load map from file
|
23
|
-
def load_map(
|
24
|
-
|
25
|
-
|
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)
|
26
29
|
|
27
30
|
# Load tiles
|
28
31
|
@tiles = []
|
@@ -35,7 +38,7 @@ class Map
|
|
35
38
|
}
|
36
39
|
|
37
40
|
# Load units
|
38
|
-
unit_count.times { load_unit(input.gets) }
|
41
|
+
unit_count.times { load_unit!(input.gets) }
|
39
42
|
|
40
43
|
puts("Save loaded: #{@name} with #{unit_count} units")
|
41
44
|
input.close
|
@@ -43,7 +46,7 @@ class Map
|
|
43
46
|
|
44
47
|
# Load core info from given head row of file
|
45
48
|
# Return number of units to be loaded
|
46
|
-
def load_head(row)
|
49
|
+
def load_head!(row)
|
47
50
|
head = []
|
48
51
|
size = []
|
49
52
|
|
@@ -58,7 +61,7 @@ class Map
|
|
58
61
|
end
|
59
62
|
|
60
63
|
# Load one unit from given row
|
61
|
-
def load_unit(row)
|
64
|
+
def load_unit!(row)
|
62
65
|
unit = []
|
63
66
|
coords = []
|
64
67
|
|
@@ -70,13 +73,13 @@ class Map
|
|
70
73
|
coords_y = coords[1].to_i
|
71
74
|
if (coords_x < 0 || coords_x >= @mapx ||
|
72
75
|
coords_y < 0 || coords_y >= @mapy)
|
73
|
-
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})")
|
74
77
|
end
|
75
78
|
|
76
79
|
# Check faction
|
77
80
|
fac = unit[1].to_i
|
78
81
|
if(fac < 0 || fac > FACTIONS)
|
79
|
-
abort("map.load_unit(): Bad faction id (#{fac})")
|
82
|
+
abort("map.load_unit!(): Bad faction id (#{fac})")
|
80
83
|
end
|
81
84
|
|
82
85
|
# Create unit
|
@@ -84,7 +87,7 @@ class Map
|
|
84
87
|
if @known_unit_types.include?(unit_type)
|
85
88
|
@known_unit_types[unit_type].new(coords_x, coords_y, fac, self, @infopane)
|
86
89
|
else
|
87
|
-
abort("map.load_unit(): Unknown unit type symbol (#{unit_type})")
|
90
|
+
abort("map.load_unit!(): Unknown unit type symbol (#{unit_type})")
|
88
91
|
end
|
89
92
|
end
|
90
93
|
|
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.
|
4
|
+
version: '0.23'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Detros
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-08-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: gosu
|
@@ -48,9 +48,10 @@ extra_rdoc_files: []
|
|
48
48
|
files:
|
49
49
|
- lib/empi.rb
|
50
50
|
- lib/lib/game_states/build_state.rb
|
51
|
-
- lib/lib/game_states/escape_state.rb
|
52
51
|
- lib/lib/game_states/game_state.rb
|
53
52
|
- lib/lib/game_states/play_state.rb
|
53
|
+
- lib/lib/game_states/quit_state.rb
|
54
|
+
- lib/lib/game_states/welcome_state.rb
|
54
55
|
- lib/lib/units/army.rb
|
55
56
|
- lib/lib/units/ship.rb
|
56
57
|
- lib/lib/units/town.rb
|