empi 0.17 → 0.18
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 +7 -0
- data/lib/cursor.rb +116 -36
- data/lib/docu/Empi v18 - printouts.png +0 -0
- data/lib/docu/Empi v18.png +0 -0
- data/lib/docu/info.txt +73 -10
- data/lib/empi.rb +24 -57
- data/lib/infopane.rb +2 -2
- data/lib/map.rb +13 -21
- data/lib/tile.rb +5 -2
- data/lib/unit.rb +5 -54
- data/lib/unitFunction.rb +1 -1
- metadata +25 -29
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 17a373e0fd7e1d69b026eb9e03e6ae1b74d9001d528fcdd2dc144693749cd534
|
4
|
+
data.tar.gz: 83104dc8fce378e990efac52715be41659e874dbe4ecf8ec8553ceffc5e3cb55
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: bd6791f595a7aa71d7e063a9d0e2d7eac6931db0d54c323a464d4967069c4fcb11274067b79e0a5cec05551b0e41e0e6c8dcf5255e08273718da1540ca39eae4
|
7
|
+
data.tar.gz: 7b5406ef092968567a0f503ae3b4bfb532ffb50219a335a8c2b47abd6b7da1a2600bf20529287e66181d201b10a9b675d043f542b8fbc2c2175b7150caac22a0
|
data/lib/cursor.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
class Cursor
|
2
|
-
attr_accessor :x, :y, :freeroam
|
2
|
+
attr_accessor :x, :y, :freeroam, :unit
|
3
3
|
|
4
4
|
def initialize(x, y, map, infopane)
|
5
5
|
dir_path = File.dirname(__FILE__)
|
@@ -11,83 +11,163 @@ 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
|
14
16
|
end
|
15
17
|
|
16
18
|
def update(key)
|
17
19
|
case key
|
18
20
|
# Cardinal directions
|
19
21
|
when Gosu::KbLeft, Gosu::KbA then
|
20
|
-
|
22
|
+
move!(-1, 0) unless @x <= 0
|
21
23
|
when Gosu::KbRight, Gosu::KbD then
|
22
|
-
|
24
|
+
move!(1, 0) unless @x >= MAPX
|
23
25
|
when Gosu::KbUp, Gosu::KbW then
|
24
|
-
|
26
|
+
move!(0, -1) unless @y <= 0
|
25
27
|
when Gosu::KbDown, Gosu::KbX then
|
26
|
-
|
28
|
+
move!(0, 1) unless @y >= MAPY
|
27
29
|
|
28
30
|
# Intercardinal directions
|
29
31
|
when Gosu::KbQ then
|
30
|
-
unless @x <= 0 || @y <= 0
|
31
|
-
@x -= 1
|
32
|
-
@y -= 1
|
33
|
-
end
|
32
|
+
move!(-1, -1) unless @x <= 0 || @y <= 0
|
34
33
|
when Gosu::KbE then
|
35
|
-
unless @x >= MAPX || @y <= 0
|
36
|
-
@x += 1
|
37
|
-
@y -= 1
|
38
|
-
end
|
34
|
+
move!(1, -1) unless @x >= MAPX || @y <= 0
|
39
35
|
when Gosu::KbZ then
|
40
|
-
unless @x <= 0 || @y >= MAPY
|
41
|
-
@x -= 1
|
42
|
-
@y += 1
|
43
|
-
end
|
36
|
+
move!(-1, 1) unless @x <= 0 || @y >= MAPY
|
44
37
|
when Gosu::KbC then
|
45
|
-
unless @x >= MAPX || @y >= MAPY
|
46
|
-
@x += 1
|
47
|
-
@y += 1
|
48
|
-
end
|
38
|
+
move!(1, 1) unless @x >= MAPX || @y >= MAPY
|
49
39
|
|
50
40
|
# Functions
|
51
41
|
when Gosu::KbS then
|
52
|
-
|
53
|
-
if uu then uu.set_function(FUNCSENTRY) end
|
42
|
+
set_function_to_unit(FUNCSENTRY)
|
54
43
|
when Gosu::KbB then
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
uu = @map.get_unit(@x, @y)
|
59
|
-
if uu then uu.set_function(FUNCNONE) end
|
44
|
+
set_function_to_unit(FUNCBUILD)
|
45
|
+
when Gosu::KbN then
|
46
|
+
set_function_to_unit(FUNCNONE)
|
60
47
|
|
61
48
|
when Gosu::KbReturn then
|
62
49
|
info
|
63
50
|
end
|
51
|
+
|
52
|
+
# If in locked mode, stay at current/jump to next movable unit
|
53
|
+
to_next_unit! unless freeroam
|
64
54
|
end
|
65
55
|
|
66
56
|
def draw
|
67
57
|
@image.draw(@x * TILESIZE, (@y + 1) * TILESIZE, ZCURSOR)
|
68
58
|
end
|
69
59
|
|
70
|
-
# Move to given
|
71
|
-
def
|
72
|
-
@x = x
|
73
|
-
@y = y
|
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
|
99
|
+
# If in locked mode
|
100
|
+
if !@unit
|
101
|
+
abort("cursor.set_function_to_unit(): Cursor is in locked mode but there is no unit it is locked to (at #{@x} - #{@y})")
|
102
|
+
end
|
103
|
+
uu = @unit
|
104
|
+
end
|
105
|
+
|
106
|
+
uu.set_function(func) unless !uu
|
107
|
+
end
|
108
|
+
|
109
|
+
# Find next unit to target with cursor
|
110
|
+
def to_next_unit!
|
111
|
+
if @unit
|
112
|
+
puts 'current unit is there'
|
113
|
+
else
|
114
|
+
puts 'nothing hereeee'
|
115
|
+
end
|
116
|
+
|
117
|
+
if @unit && @unit.can_move?
|
118
|
+
puts 'current unit can move'
|
119
|
+
end
|
120
|
+
|
121
|
+
if @unit && @unit.function == FUNCNONE
|
122
|
+
puts 'current unit has no function set'
|
123
|
+
end
|
124
|
+
|
125
|
+
unless @unit && @unit.can_move? && @unit.function == FUNCNONE # unless the current one is still movable
|
126
|
+
puts 'searching'
|
127
|
+
movable_units = @map.all_units.select { |uu| uu.can_move? && uu.function == FUNCNONE}
|
128
|
+
|
129
|
+
# If there are no more movable units without function, switch to freeroam mode
|
130
|
+
if movable_units.size <= 0 # == would be enough
|
131
|
+
puts 'all movable units without functions moved'
|
132
|
+
|
133
|
+
switch_freeroam!
|
134
|
+
return
|
135
|
+
end
|
136
|
+
|
137
|
+
@unit = movable_units[0] # newly selected one
|
138
|
+
end
|
139
|
+
puts 'ready'
|
140
|
+
|
141
|
+
warp_to!(@unit) # stay at old or go to new
|
142
|
+
info
|
74
143
|
end
|
75
144
|
|
76
145
|
# Switch between being attached to unit and being able to freeroam
|
77
|
-
def switch_freeroam
|
78
|
-
if freeroam
|
146
|
+
def switch_freeroam!
|
147
|
+
if freeroam
|
79
148
|
@infopane.text = 'freeroam disabled'
|
80
149
|
puts 'freeroam disabled'
|
150
|
+
@freeroam = false
|
151
|
+
to_next_unit!
|
81
152
|
else
|
82
153
|
@infopane.text = 'freeroam enabled'
|
83
154
|
puts 'freeroam enabled'
|
155
|
+
@freeroam = true
|
156
|
+
@unit = nil
|
84
157
|
end
|
85
|
-
@freeroam = !@freeroam
|
86
158
|
end
|
87
159
|
|
88
160
|
# Find some info about units on the current tile
|
89
161
|
def info
|
90
|
-
|
162
|
+
if freeroam
|
163
|
+
uu = @map.get_unit(@x, @y)
|
164
|
+
else
|
165
|
+
if !@unit
|
166
|
+
abort("cursor.info(): Cursor is in locked mode but there is no unit it is locked to (at #{@x} - #{@y})")
|
167
|
+
end
|
168
|
+
uu = @unit
|
169
|
+
end
|
170
|
+
|
91
171
|
if uu
|
92
172
|
@infopane.text = uu.info
|
93
173
|
puts uu.info
|
Binary file
|
Binary file
|
data/lib/docu/info.txt
CHANGED
@@ -1,9 +1,66 @@
|
|
1
1
|
/-- /// /-/ -/-
|
2
|
-
/-- ||| /-/ |
|
2
|
+
/-- ||| /-/ |
|
3
3
|
/-- ||| | -/-
|
4
4
|
|
5
5
|
Empi: Ruby Edition
|
6
6
|
====================
|
7
|
+
CC-BY-SA 3.0, Detros
|
8
|
+
http://www.bay12forums.com/smf/index.php?topic=157538
|
9
|
+
rasunadon@seznam.cz
|
10
|
+
|
11
|
+
|
12
|
+
v18 dev
|
13
|
+
=========
|
14
|
+
- help is now listing all keys
|
15
|
+
- help shown after the first load of new map
|
16
|
+
- units use all left moves when loaded, unless they are loaded into towns
|
17
|
+
- even units with 0 moves left show their moves in their info
|
18
|
+
- added "End of turn" marker
|
19
|
+
- added licensing/contact info also to this info file and not just to gem specs
|
20
|
+
- several exception handlers added to Cursor
|
21
|
+
- units stored in Tile class
|
22
|
+
fixed: units are still stored via Map class instead of Tile one
|
23
|
+
- movement and function keys processed in Cursor, movement checked in Unit
|
24
|
+
fixed: units are still accessed via Window class instead of Cursor one
|
25
|
+
- moving of cursor stores the current unit so it can possibly get moved (again)
|
26
|
+
- function setting of units separated to its own method
|
27
|
+
- autodisabling of freeroam mode on each end of turn moved to the start of next turn
|
28
|
+
|
29
|
+
! help should be shown after each load of new map
|
30
|
+
! transported units can't get commands from freeroaming cursor
|
31
|
+
! transported units don't function properly, their transports secretly function instead of them
|
32
|
+
! unit info shown twice at the start of the first turn
|
33
|
+
! units which can't build can still have function set to build (though they do protest)
|
34
|
+
|
35
|
+
empi.rb
|
36
|
+
help shown at the start of game
|
37
|
+
"End of turn" marker
|
38
|
+
removed calling of @map.draw_units
|
39
|
+
removed search for next movable unit
|
40
|
+
|
41
|
+
map.rb
|
42
|
+
all_map_units() uses indirect access via get_unit()
|
43
|
+
get_unit(), set_unit() access given coordinates of @tiles
|
44
|
+
draw_units() and @units removed
|
45
|
+
|
46
|
+
unit.rb
|
47
|
+
removed processing of movement and function keys
|
48
|
+
info() uses @moves_max > 0 instead of can_move()
|
49
|
+
check_movement() sets @moves_left to 1 when unit is loaded so it then gets lowered to 0
|
50
|
+
|
51
|
+
cursor.rb
|
52
|
+
switch_freeroam() renamed to switch_freeroam!()
|
53
|
+
+move! - Move by given change of coordinates
|
54
|
+
+to_next_unit! - Find next unit to target with cursor
|
55
|
+
@unit
|
56
|
+
+set_function_to_unit(func) - Tries to set function <func> to currently selected unit
|
57
|
+
|
58
|
+
tile.rb
|
59
|
+
@unit
|
60
|
+
|
61
|
+
infopane.rb
|
62
|
+
removed one space from score output
|
63
|
+
|
7
64
|
|
8
65
|
v17 dev
|
9
66
|
=========
|
@@ -60,7 +117,7 @@ army.rb
|
|
60
117
|
|
61
118
|
town.rb
|
62
119
|
can be captured
|
63
|
-
|
120
|
+
|
64
121
|
save/m02.esf
|
65
122
|
+two ships, one for each faction
|
66
123
|
|
@@ -77,8 +134,8 @@ v16 dev
|
|
77
134
|
! hardcoded unit type to be built
|
78
135
|
- units can transport other units
|
79
136
|
- newly built units are stored in town instead of map
|
80
|
-
|
81
|
-
! transported units are
|
137
|
+
fixed: new units are saved in map instead of the towns that built them
|
138
|
+
! transported units are never drawn
|
82
139
|
! transported units show only info of their transport instead when selected
|
83
140
|
! all units can capture and visit towns
|
84
141
|
|
@@ -113,7 +170,7 @@ ship.rb
|
|
113
170
|
|
114
171
|
unitFunction.rb
|
115
172
|
+FUNCBUILD case in func!()
|
116
|
-
FUNCSENTRY case in func!() sets "ret" even when unit keeps sentrying
|
173
|
+
FUNCSENTRY case in func!() sets "ret" even when unit keeps sentrying
|
117
174
|
|
118
175
|
|
119
176
|
v15 dev
|
@@ -180,8 +237,9 @@ older versions
|
|
180
237
|
- rudimentary terrain checking after move
|
181
238
|
- capturing of units
|
182
239
|
- turn and score counting
|
183
|
-
-
|
184
|
-
- next
|
240
|
+
- command line and screen text output
|
241
|
+
- next available unit / freeroam cursor
|
242
|
+
|
185
243
|
|
186
244
|
current state
|
187
245
|
===============
|
@@ -206,14 +264,19 @@ new problems
|
|
206
264
|
! hardcoded save file name
|
207
265
|
! hardcoded map size
|
208
266
|
! hardcoded unit type to be built
|
209
|
-
! transported units are
|
267
|
+
! transported units are never drawn
|
210
268
|
!x transported units show only info of their transport instead when selected
|
211
269
|
!x all units can capture and visit towns
|
212
|
-
! units are still stored via Map class instead of Tile one
|
213
|
-
! units are still accessed via Window class instead of Cursor one
|
270
|
+
!x units are still stored via Map class instead of Tile one
|
271
|
+
!x units are still accessed via Window class instead of Cursor one
|
214
272
|
! damaged units are destroyed
|
215
273
|
! transported units show in infopane info of their transport instead when selected
|
216
274
|
! capturing town with units leaves those enemy units inside
|
275
|
+
! help should be shown after each load of new map
|
276
|
+
! transported units can't get commands from freeroaming cursor
|
277
|
+
! transported units don't function properly, their transports secretly function instead of them
|
278
|
+
! unit info shown twice at the start of the first turn
|
279
|
+
! units which can't build can still have function set to build (though they do protest)
|
217
280
|
|
218
281
|
(! thing to fix, !x fixed thing)
|
219
282
|
|
data/lib/empi.rb
CHANGED
@@ -36,19 +36,24 @@ class GameWindow < Gosu::Window
|
|
36
36
|
height = (MAPY + 2) * TILESIZE, \
|
37
37
|
fullscreen = false)
|
38
38
|
super
|
39
|
-
self.caption = 'Empi: Ruby Edition 0.
|
39
|
+
self.caption = 'Empi: Ruby Edition 0.18 dev'
|
40
40
|
|
41
41
|
@infopane = Infopane.new
|
42
42
|
@map = Map.new(@infopane)
|
43
|
-
@cursor = Cursor.new(
|
44
|
-
|
43
|
+
@cursor = Cursor.new(0, 0, @map, @infopane)
|
44
|
+
help # show help after loading of map
|
45
45
|
new_turn
|
46
46
|
end
|
47
47
|
|
48
48
|
def button_up(key)
|
49
49
|
@button = key
|
50
|
+
end
|
50
51
|
|
51
|
-
|
52
|
+
# Process given button to cursor
|
53
|
+
def update
|
54
|
+
case(@button)
|
55
|
+
when -1 then # no keys pressed
|
56
|
+
return
|
52
57
|
when Gosu::KbEscape then
|
53
58
|
close
|
54
59
|
when Gosu::KbPeriod then
|
@@ -56,46 +61,9 @@ class GameWindow < Gosu::Window
|
|
56
61
|
when Gosu::KbH then
|
57
62
|
help
|
58
63
|
when Gosu::KbJ then
|
59
|
-
|
60
|
-
@cursor.switch_freeroam
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
# Process given button to cursor
|
65
|
-
def update
|
66
|
-
if @button == -1 then return end
|
67
|
-
|
68
|
-
movable_units = @map.all_units.select { |uu| uu.can_move? && uu.function == FUNCNONE}
|
69
|
-
# If there are any movable units without functions select one of them with the cursor
|
70
|
-
if @cursor.freeroam == false && movable_units.size > 0
|
71
|
-
unit_to_move = movable_units[0]
|
72
|
-
unit_to_move.update(@button)
|
73
|
-
|
74
|
-
# Can it still move?
|
75
|
-
if unit_to_move.can_move? && unit_to_move.function == FUNCNONE
|
76
|
-
# Move the cursor to it unless it is already there
|
77
|
-
if (@cursor.x != unit_to_move.x \
|
78
|
-
|| @cursor.y != unit_to_move.y)
|
79
|
-
@cursor.warp(unit_to_move.x, unit_to_move.y)
|
80
|
-
end
|
81
|
-
@cursor.info
|
82
|
-
else
|
83
|
-
# Was that the last currently avaiable non-function move?
|
84
|
-
movable_units = @map.all_units.select { |uu| uu.can_move? && uu.function == FUNCNONE}
|
85
|
-
if movable_units.size == 0
|
86
|
-
puts 'all movable units without functions moved'
|
87
|
-
@cursor.switch_freeroam
|
88
|
-
else
|
89
|
-
# Move cursor to next avaiable unit
|
90
|
-
unit_to_move = movable_units[0]
|
91
|
-
@cursor.warp(unit_to_move.x, unit_to_move.y)
|
92
|
-
@cursor.info
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
64
|
+
@cursor.switch_freeroam!
|
96
65
|
else
|
97
|
-
|
98
|
-
@cursor.update(@button)
|
66
|
+
@cursor.update(@button)
|
99
67
|
end
|
100
68
|
end
|
101
69
|
|
@@ -105,38 +73,37 @@ class GameWindow < Gosu::Window
|
|
105
73
|
end
|
106
74
|
|
107
75
|
def draw
|
108
|
-
@button = -1 #
|
76
|
+
@button = -1 # draw just once after each button press
|
109
77
|
|
110
|
-
# Draw map tiles and units
|
111
78
|
@map.draw_tiles
|
112
|
-
@map.draw_units
|
113
|
-
# DEBUG @map.all_units.each { |uu| puts uu.info}
|
114
|
-
|
115
79
|
@cursor.draw
|
116
80
|
@infopane.draw
|
117
81
|
|
118
|
-
|
119
|
-
# self, "Empire", Gosu.default_font_name, 20)
|
120
|
-
# @message.draw(10, 10, 2)
|
82
|
+
# DEBUG @map.all_units.each { |uu| puts uu.info}
|
121
83
|
end
|
122
84
|
|
123
|
-
# End current turn and start next one
|
85
|
+
# End current turn and start the next one
|
124
86
|
def new_turn
|
125
|
-
|
126
|
-
|
87
|
+
puts "=============\n" \
|
88
|
+
"End of turn\n" \
|
89
|
+
"=============\n"
|
127
90
|
|
128
91
|
functionable_units = @map.all_units.select { |uu| uu.function != FUNCNONE}
|
129
92
|
functionable_units.each { |uu| uu.function! }
|
130
93
|
|
131
94
|
@map.all_units.each { |uu| uu.reset_moves!}
|
132
95
|
@infopane.next_turn
|
96
|
+
|
97
|
+
@cursor.freeroam = true
|
98
|
+
@cursor.switch_freeroam! # so freeroam = false, with messages
|
133
99
|
end
|
134
100
|
|
135
101
|
def help
|
136
|
-
puts "
|
137
|
-
"
|
102
|
+
puts "-----------\n" \
|
103
|
+
"h: help, Esc: end game, Enter: info, j: switch freeroam\n" \
|
104
|
+
"QWEADZXC or arrow keys: movement, .: end turn\n" \
|
138
105
|
"functions: s sentry, n none\n" \
|
139
|
-
"
|
106
|
+
"-----------\n"
|
140
107
|
end
|
141
108
|
end
|
142
109
|
|
data/lib/infopane.rb
CHANGED
@@ -14,7 +14,7 @@ class Infopane
|
|
14
14
|
|
15
15
|
def draw
|
16
16
|
turnscore = Gosu::Image.from_text(
|
17
|
-
self, "Turn: #{@turn}, Score: #{@score[0]} -
|
17
|
+
self, "Turn: #{@turn}, Score: #{@score[0]} - #{@score[1]}", Gosu.default_font_name, 20)
|
18
18
|
turnscore.draw(XTEXT, YTEXT, ZTEXT)
|
19
19
|
|
20
20
|
text = Gosu::Image.from_text(self, "#{@text}", Gosu.default_font_name, 20)
|
@@ -27,7 +27,7 @@ class Infopane
|
|
27
27
|
|
28
28
|
def next_turn
|
29
29
|
@turn += 1
|
30
|
-
puts "Turn: #{@turn}, Score: #{@score[0]} -
|
30
|
+
puts "Turn: #{@turn}, Score: #{@score[0]} - #{@score[1]}"
|
31
31
|
end
|
32
32
|
|
33
33
|
def add_score(to_whom, how_much)
|
data/lib/map.rb
CHANGED
@@ -5,7 +5,6 @@ SYMBOL_SHIP = 'S'
|
|
5
5
|
class Map
|
6
6
|
attr_accessor :name, :mapx, :mapy, :infopane
|
7
7
|
|
8
|
-
# Fill tile map and prepare
|
9
8
|
def initialize(infopane)
|
10
9
|
dir_path = File.dirname(__FILE__)
|
11
10
|
|
@@ -20,10 +19,8 @@ class Map
|
|
20
19
|
|
21
20
|
# Load tiles
|
22
21
|
@tiles = []
|
23
|
-
@units = []
|
24
22
|
0.upto(@mapy - 1) { |rr|
|
25
23
|
@tiles[rr] = []
|
26
|
-
@units[rr] = []
|
27
24
|
map_row = input.gets
|
28
25
|
0.upto(@mapx - 1) { |cc|
|
29
26
|
@tiles[rr][cc] = Tile.new(cc, rr, map_row[cc], @infopane)
|
@@ -53,21 +50,15 @@ class Map
|
|
53
50
|
head[2].to_i # unit_count
|
54
51
|
end
|
55
52
|
|
56
|
-
# Load one unit from given
|
53
|
+
# Load one unit from given row
|
57
54
|
def load_unit(row)
|
58
55
|
unit = []
|
59
56
|
coords = []
|
60
57
|
|
61
58
|
unit = row.split(' ')
|
62
|
-
coords = unit[2].split('-')
|
63
|
-
|
64
|
-
# Check faction
|
65
|
-
fac = unit[1].to_i
|
66
|
-
if(fac < 0 || fac > FACTIONS)
|
67
|
-
abort("map.load_unit(): Bad faction id (#{fac})")
|
68
|
-
end
|
69
59
|
|
70
60
|
# Check coordinates
|
61
|
+
coords = unit[2].split('-')
|
71
62
|
coords_x = coords[0].to_i
|
72
63
|
coords_y = coords[1].to_i
|
73
64
|
if (coords_x < 0 || coords_x >= @mapx ||
|
@@ -75,6 +66,12 @@ class Map
|
|
75
66
|
abort("map.load_unit(): Unit out of map borders (#{coords_x}-#{coords_y})")
|
76
67
|
end
|
77
68
|
|
69
|
+
# Check faction
|
70
|
+
fac = unit[1].to_i
|
71
|
+
if(fac < 0 || fac > FACTIONS)
|
72
|
+
abort("map.load_unit(): Bad faction id (#{fac})")
|
73
|
+
end
|
74
|
+
|
78
75
|
# Create unit
|
79
76
|
case(unit[0])
|
80
77
|
when SYMBOL_TOWN then
|
@@ -93,11 +90,6 @@ class Map
|
|
93
90
|
all_tiles.each { |tt| tt.draw} # TODO combine with draw_units() ?
|
94
91
|
end
|
95
92
|
|
96
|
-
# Draw all map units
|
97
|
-
def draw_units
|
98
|
-
all_map_units.each { |uu| uu.draw} # TODO do not draw transported units? only draw them on selection (with their tile)?
|
99
|
-
end
|
100
|
-
|
101
93
|
# Getter for tile in given coordinates
|
102
94
|
def tile(cc, rr)
|
103
95
|
@tiles[rr][cc]
|
@@ -118,12 +110,12 @@ class Map
|
|
118
110
|
|
119
111
|
# Getter for unit in given coordinates
|
120
112
|
def get_unit(cc, rr)
|
121
|
-
@
|
113
|
+
@tiles[rr][cc].unit
|
122
114
|
end
|
123
115
|
|
124
|
-
# Setter for
|
116
|
+
# Setter for unit in given coordinates
|
125
117
|
def set_unit(cc, rr, uu)
|
126
|
-
@
|
118
|
+
@tiles[rr][cc].unit = uu
|
127
119
|
end
|
128
120
|
|
129
121
|
# Return both map units and transported units
|
@@ -137,8 +129,8 @@ class Map
|
|
137
129
|
ii = 0
|
138
130
|
0.upto(MAPX) { |rr|
|
139
131
|
0.upto(MAPX) { |cc|
|
140
|
-
if
|
141
|
-
ret[ii] =
|
132
|
+
if get_unit(cc, rr)
|
133
|
+
ret[ii] = get_unit(cc, rr)
|
142
134
|
ii += 1
|
143
135
|
end
|
144
136
|
}
|
data/lib/tile.rb
CHANGED
@@ -5,9 +5,8 @@ SYMBOL_SEA = '.'
|
|
5
5
|
SYMBOL_GROUND = '#'
|
6
6
|
|
7
7
|
class Tile
|
8
|
-
attr_accessor :terrain, :infopane
|
8
|
+
attr_accessor :terrain, :infopane, :unit
|
9
9
|
|
10
|
-
# Fill tile map and prepare
|
11
10
|
def initialize(x, y, loaded_symbol, infopane)
|
12
11
|
dir_path = File.dirname(__FILE__)
|
13
12
|
|
@@ -29,5 +28,9 @@ class Tile
|
|
29
28
|
|
30
29
|
def draw
|
31
30
|
@image.draw(@x * TILESIZE, (@y + 1) * TILESIZE, ZTILE)
|
31
|
+
|
32
|
+
if @unit
|
33
|
+
@unit.draw
|
34
|
+
end
|
32
35
|
end
|
33
36
|
end
|
data/lib/unit.rb
CHANGED
@@ -22,8 +22,6 @@ class Unit
|
|
22
22
|
@cargo_max = 0
|
23
23
|
@function = UnitFunction.new(FUNCNONE)
|
24
24
|
|
25
|
-
|
26
|
-
|
27
25
|
# Store yourself
|
28
26
|
coords_unit = @map.get_unit(@x, @y)
|
29
27
|
if !coords_unit
|
@@ -33,7 +31,7 @@ class Unit
|
|
33
31
|
end
|
34
32
|
end
|
35
33
|
|
36
|
-
# Add <value> to the other faction
|
34
|
+
# Add <value> to the other faction and remove links to given unit
|
37
35
|
def destroy
|
38
36
|
@infopane.add_score(3 - @faction - 1, @value) # TODO more factions?
|
39
37
|
# TODO is this deleted enough?
|
@@ -51,57 +49,9 @@ class Unit
|
|
51
49
|
end
|
52
50
|
end
|
53
51
|
|
54
|
-
def update(key)
|
55
|
-
old_x = @x
|
56
|
-
old_y = @y
|
57
|
-
|
58
|
-
case key
|
59
|
-
# Cardinal directions
|
60
|
-
when Gosu::KbLeft, Gosu::KbA then
|
61
|
-
@x -= 1 unless @x <= 0
|
62
|
-
when Gosu::KbRight, Gosu::KbD then
|
63
|
-
@x += 1 unless @x >= MAPX
|
64
|
-
when Gosu::KbUp, Gosu::KbW then
|
65
|
-
@y -= 1 unless @y <= 0
|
66
|
-
when Gosu::KbDown, Gosu::KbX then
|
67
|
-
@y += 1 unless @y >= MAPY
|
68
|
-
|
69
|
-
# Intercardinal directions
|
70
|
-
when Gosu::KbQ then
|
71
|
-
unless @x <= 0 || @y <= 0
|
72
|
-
@x -= 1
|
73
|
-
@y -= 1
|
74
|
-
end
|
75
|
-
when Gosu::KbE then
|
76
|
-
unless @x >= MAPX || @y <= 0
|
77
|
-
@x += 1
|
78
|
-
@y -= 1
|
79
|
-
end
|
80
|
-
when Gosu::KbZ then
|
81
|
-
unless @x <= 0 || @y >= MAPY
|
82
|
-
@x -= 1
|
83
|
-
@y += 1
|
84
|
-
end
|
85
|
-
when Gosu::KbC then
|
86
|
-
unless @x >= MAPX || @y >= MAPY
|
87
|
-
@x += 1
|
88
|
-
@y += 1
|
89
|
-
end
|
90
|
-
|
91
|
-
# Functions
|
92
|
-
when Gosu::KbS then
|
93
|
-
set_function(FUNCSENTRY)
|
94
|
-
when Gosu::KbB then
|
95
|
-
set_function(FUNCBUILD)
|
96
|
-
end
|
97
|
-
|
98
|
-
check_movement(old_x, old_y)
|
99
|
-
end
|
100
|
-
|
101
|
-
|
102
52
|
# Processes move of unit and takes care of its (un)loading or attack
|
103
53
|
def check_movement(old_x, old_y)
|
104
|
-
if @x != old_x || @y != old_y
|
54
|
+
if @x != old_x || @y != old_y # only if it moved
|
105
55
|
if @moves_left <= 0
|
106
56
|
abort("unit.check_movement(): Moving unit does not have enough move points (#{@moves_left} moves)")
|
107
57
|
end
|
@@ -133,6 +83,7 @@ class Unit
|
|
133
83
|
else # if you are going to be transported
|
134
84
|
newcoords_unit.cargo.insert(-1, self) # -1 = to the end
|
135
85
|
puts PROMPT + to_s + ' got loaded into '+ newcoords_unit.to_s
|
86
|
+
@moves_left = 1 unless newcoords_unit.can_build? # use all your left moves unless you are getting loaded into a town
|
136
87
|
end
|
137
88
|
|
138
89
|
else # if there already is somebody that can't transport you (enemy or full friend)
|
@@ -144,7 +95,7 @@ class Unit
|
|
144
95
|
if newcoords_unit.faction == @faction
|
145
96
|
if !newcoords_unit.can_transport?
|
146
97
|
puts PROMPT + newcoords_unit.to_s + ' can\'t transport other units'
|
147
|
-
else # newcoords_unit.
|
98
|
+
else # newcoords_unit.can_transport?; has to be full then
|
148
99
|
puts PROMPT + newcoords_unit.to_s + ' is already full'
|
149
100
|
end
|
150
101
|
else
|
@@ -268,7 +219,7 @@ class Unit
|
|
268
219
|
def info
|
269
220
|
ret = to_s + ": armor #{@armor_left}/#{@armor_max}"
|
270
221
|
|
271
|
-
if
|
222
|
+
if @moves_max > 0
|
272
223
|
ret = ret + ", moves #{@moves_left}/#{@moves_max}"
|
273
224
|
end
|
274
225
|
|
data/lib/unitFunction.rb
CHANGED
metadata
CHANGED
@@ -1,49 +1,44 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: empi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
5
|
-
prerelease:
|
4
|
+
version: '0.18'
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Detros
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2019-11-24 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: gosu
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - "~>"
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '0'
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - "~>"
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: '0'
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: rake
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- - ~>
|
31
|
+
- - "~>"
|
36
32
|
- !ruby/object:Gem::Version
|
37
33
|
version: '10.0'
|
38
34
|
type: :development
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- - ~>
|
38
|
+
- - "~>"
|
44
39
|
- !ruby/object:Gem::Version
|
45
40
|
version: '10.0'
|
46
|
-
description:
|
41
|
+
description: 'Empi: Ruby Edition is a turn based wargame, currently deep in development.
|
47
42
|
While learning Ruby I have found there are hardly any strategic games avaiable.
|
48
43
|
So this should be Ruby version of Classic Empire, wargame from old times.'
|
49
44
|
email: rasunadon@seznam.cz
|
@@ -51,50 +46,51 @@ executables: []
|
|
51
46
|
extensions: []
|
52
47
|
extra_rdoc_files: []
|
53
48
|
files:
|
49
|
+
- lib/army.rb
|
50
|
+
- lib/cursor.rb
|
54
51
|
- lib/docu/Empi v14.png
|
52
|
+
- lib/docu/Empi v18 - printouts.png
|
53
|
+
- lib/docu/Empi v18.png
|
55
54
|
- lib/docu/info.txt
|
56
|
-
- lib/
|
57
|
-
- lib/
|
55
|
+
- lib/empi.rb
|
56
|
+
- lib/infopane.rb
|
57
|
+
- lib/map.rb
|
58
58
|
- lib/media/army.png
|
59
59
|
- lib/media/cursor.png
|
60
|
-
- lib/media/sea.png
|
61
60
|
- lib/media/ground.png
|
62
|
-
- lib/
|
61
|
+
- lib/media/sea.png
|
62
|
+
- lib/media/ship.png
|
63
|
+
- lib/media/town.png
|
63
64
|
- lib/save/m01.esf
|
65
|
+
- lib/save/m02.esf
|
64
66
|
- lib/save/m03.esf
|
65
67
|
- lib/ship.rb
|
66
68
|
- lib/tile.rb
|
69
|
+
- lib/town.rb
|
67
70
|
- lib/unit.rb
|
68
71
|
- lib/unitFunction.rb
|
69
|
-
- lib/town.rb
|
70
|
-
- lib/map.rb
|
71
|
-
- lib/army.rb
|
72
|
-
- lib/cursor.rb
|
73
|
-
- lib/infopane.rb
|
74
|
-
- lib/empi.rb
|
75
72
|
homepage: http://www.bay12forums.com/smf/index.php?topic=157538
|
76
73
|
licenses:
|
77
|
-
- CC-BY-SA
|
74
|
+
- CC-BY-SA-3.0
|
75
|
+
metadata: {}
|
78
76
|
post_install_message:
|
79
77
|
rdoc_options: []
|
80
78
|
require_paths:
|
81
79
|
- lib
|
82
80
|
required_ruby_version: !ruby/object:Gem::Requirement
|
83
|
-
none: false
|
84
81
|
requirements:
|
85
|
-
- -
|
82
|
+
- - ">="
|
86
83
|
- !ruby/object:Gem::Version
|
87
84
|
version: '0'
|
88
85
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
86
|
requirements:
|
91
|
-
- -
|
87
|
+
- - ">="
|
92
88
|
- !ruby/object:Gem::Version
|
93
89
|
version: '0'
|
94
90
|
requirements: []
|
95
91
|
rubyforge_project:
|
96
|
-
rubygems_version:
|
92
|
+
rubygems_version: 2.7.6
|
97
93
|
signing_key:
|
98
|
-
specification_version:
|
94
|
+
specification_version: 4
|
99
95
|
summary: Turn-based wargame
|
100
96
|
test_files: []
|