empi 0.18 → 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 +22 -75
- data/lib/lib/game_states/build_state.rb +82 -0
- data/lib/lib/game_states/game_state.rb +27 -0
- data/lib/lib/game_states/play_state.rb +135 -0
- data/lib/lib/game_states/quit_state.rb +33 -0
- data/lib/lib/game_states/welcome_state.rb +64 -0
- data/lib/{army.rb → lib/units/army.rb} +6 -3
- data/lib/{ship.rb → lib/units/ship.rb} +6 -3
- data/lib/lib/units/town.rb +106 -0
- data/lib/lib/units/unit.rb +301 -0
- data/lib/lib/units/unitFunction.rb +63 -0
- data/lib/lib/user_interface/cursor.rb +184 -0
- data/lib/lib/user_interface/infopane.rb +49 -0
- data/lib/{map.rb → lib/user_interface/map.rb} +32 -26
- data/lib/{tile.rb → lib/user_interface/tile.rb} +2 -2
- data/lib/docu/Empi v18.png b/data/lib/media/Empi → v18.png +0 -0
- data/lib/save/m02-err.esf +26 -0
- metadata +26 -18
- data/lib/cursor.rb +0 -183
- data/lib/docu/Empi v14.png +0 -0
- data/lib/docu/Empi v18 - printouts.png +0 -0
- data/lib/docu/info.txt +0 -282
- data/lib/infopane.rb +0 -36
- data/lib/town.rb +0 -28
- data/lib/unit.rb +0 -238
- data/lib/unitFunction.rb +0 -47
data/lib/infopane.rb
DELETED
@@ -1,36 +0,0 @@
|
|
1
|
-
# Score, turn and event texts
|
2
|
-
class Infopane
|
3
|
-
attr_writer :text, :act_fact
|
4
|
-
|
5
|
-
def initialize
|
6
|
-
@score = [0, 0]
|
7
|
-
@turn = 0
|
8
|
-
@act_fact = 0 # active faction
|
9
|
-
@text = 'ready'
|
10
|
-
end
|
11
|
-
|
12
|
-
def update
|
13
|
-
end
|
14
|
-
|
15
|
-
def draw
|
16
|
-
turnscore = Gosu::Image.from_text(
|
17
|
-
self, "Turn: #{@turn}, Score: #{@score[0]} - #{@score[1]}", Gosu.default_font_name, 20)
|
18
|
-
turnscore.draw(XTEXT, YTEXT, ZTEXT)
|
19
|
-
|
20
|
-
text = Gosu::Image.from_text(self, "#{@text}", Gosu.default_font_name, 20)
|
21
|
-
text.draw(XTEXT, (TILESIZE / 2) + YTEXT, ZTEXT)
|
22
|
-
end
|
23
|
-
|
24
|
-
def next_faction
|
25
|
-
|
26
|
-
end
|
27
|
-
|
28
|
-
def next_turn
|
29
|
-
@turn += 1
|
30
|
-
puts "Turn: #{@turn}, Score: #{@score[0]} - #{@score[1]}"
|
31
|
-
end
|
32
|
-
|
33
|
-
def add_score(to_whom, how_much)
|
34
|
-
@score[to_whom] += how_much
|
35
|
-
end
|
36
|
-
end
|
data/lib/town.rb
DELETED
@@ -1,28 +0,0 @@
|
|
1
|
-
require_relative './unit'
|
2
|
-
|
3
|
-
class Town < Unit
|
4
|
-
attr_accessor :parts_built
|
5
|
-
|
6
|
-
def initialize(x, y, faction, map, infopane)
|
7
|
-
super
|
8
|
-
dir_path = File.dirname(__FILE__)
|
9
|
-
@image = Gosu::Image.new(dir_path + '/media/town.png')
|
10
|
-
|
11
|
-
@name = 'town'
|
12
|
-
@value = 20
|
13
|
-
@armor_left = @armor_max = 1
|
14
|
-
@moves_max = 0
|
15
|
-
|
16
|
-
@parts_built = 0
|
17
|
-
@cargo_max = 10
|
18
|
-
set_function(FUNCBUILD)
|
19
|
-
end
|
20
|
-
|
21
|
-
def can_build?
|
22
|
-
true
|
23
|
-
end
|
24
|
-
|
25
|
-
def can_be_captured?
|
26
|
-
true
|
27
|
-
end
|
28
|
-
end
|
data/lib/unit.rb
DELETED
@@ -1,238 +0,0 @@
|
|
1
|
-
require_relative './unitFunction'
|
2
|
-
|
3
|
-
# All capturable game pieces
|
4
|
-
class Unit
|
5
|
-
attr_accessor :x, :y, :faction, :function, :cargo
|
6
|
-
|
7
|
-
|
8
|
-
def initialize(x, y, faction, map, infopane)
|
9
|
-
@x = x
|
10
|
-
@y = y
|
11
|
-
@faction = faction
|
12
|
-
@map = map
|
13
|
-
@infopane = infopane
|
14
|
-
|
15
|
-
@name = 'unit'
|
16
|
-
@value = 1
|
17
|
-
@armor_max = 1
|
18
|
-
@armor_left = @armor_max
|
19
|
-
@moves_max = 1
|
20
|
-
@moves_left = @moves_max
|
21
|
-
@cargo = [] # transported units
|
22
|
-
@cargo_max = 0
|
23
|
-
@function = UnitFunction.new(FUNCNONE)
|
24
|
-
|
25
|
-
# Store yourself
|
26
|
-
coords_unit = @map.get_unit(@x, @y)
|
27
|
-
if !coords_unit
|
28
|
-
@map.set_unit(@x, @y, self)
|
29
|
-
else # some town has just built you
|
30
|
-
coords_unit.cargo.insert(-1, self) # -1 = to the end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
# Add <value> to the other faction and remove links to given unit
|
35
|
-
def destroy
|
36
|
-
@infopane.add_score(3 - @faction - 1, @value) # TODO more factions?
|
37
|
-
# TODO is this deleted enough?
|
38
|
-
@map.set_unit(@x, @y, nil)
|
39
|
-
end
|
40
|
-
|
41
|
-
def capture(by_whom)
|
42
|
-
# add <value> to the capturing faction
|
43
|
-
@infopane.add_score(by_whom - 1, @value)
|
44
|
-
@faction = by_whom
|
45
|
-
|
46
|
-
# if you are a town, start building units
|
47
|
-
if can_build?
|
48
|
-
set_function(FUNCBUILD)
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
# Processes move of unit and takes care of its (un)loading or attack
|
53
|
-
def check_movement(old_x, old_y)
|
54
|
-
if @x != old_x || @y != old_y # only if it moved
|
55
|
-
if @moves_left <= 0
|
56
|
-
abort("unit.check_movement(): Moving unit does not have enough move points (#{@moves_left} moves)")
|
57
|
-
end
|
58
|
-
|
59
|
-
oldcoords_unit = @map.get_unit(old_x, old_y)
|
60
|
-
newcoords_unit = @map.get_unit(@x, @y)
|
61
|
-
|
62
|
-
# If there is nobody or is there friendly unit with some cargo space
|
63
|
-
if !newcoords_unit || \
|
64
|
-
(newcoords_unit.faction == @faction && \
|
65
|
-
newcoords_unit.can_transport? && \
|
66
|
-
!newcoords_unit.is_full?)
|
67
|
-
|
68
|
-
# Leave old coordinates
|
69
|
-
if oldcoords_unit == self
|
70
|
-
@map.set_unit(old_x, old_y, nil)
|
71
|
-
else # if you have been transported
|
72
|
-
oldcoords_unit.cargo.delete(self)
|
73
|
-
end
|
74
|
-
|
75
|
-
# Get to new coordinates
|
76
|
-
if newcoords_unit == nil
|
77
|
-
@map.set_unit(@x, @y, self)
|
78
|
-
@cargo.each { |uu|
|
79
|
-
uu.x = @x
|
80
|
-
uu.y = @y
|
81
|
-
}
|
82
|
-
|
83
|
-
else # if you are going to be transported
|
84
|
-
newcoords_unit.cargo.insert(-1, self) # -1 = to the end
|
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
|
87
|
-
end
|
88
|
-
|
89
|
-
else # if there already is somebody that can't transport you (enemy or full friend)
|
90
|
-
# Stay on your original tile
|
91
|
-
@x = old_x
|
92
|
-
@y = old_y
|
93
|
-
|
94
|
-
# If it was a friend unit
|
95
|
-
if newcoords_unit.faction == @faction
|
96
|
-
if !newcoords_unit.can_transport?
|
97
|
-
puts PROMPT + newcoords_unit.to_s + ' can\'t transport other units'
|
98
|
-
else # newcoords_unit.can_transport?; has to be full then
|
99
|
-
puts PROMPT + newcoords_unit.to_s + ' is already full'
|
100
|
-
end
|
101
|
-
else
|
102
|
-
# Can it be captured?
|
103
|
-
if newcoords_unit.can_be_captured?
|
104
|
-
if can_capture? # then capture it if you can
|
105
|
-
puts PROMPT + to_s + ' is capturing ' + newcoords_unit.to_s
|
106
|
-
newcoords_unit.capture(@faction)
|
107
|
-
else
|
108
|
-
puts PROMPT + to_s + ' can\'t capture other units'
|
109
|
-
end
|
110
|
-
else # then battle it
|
111
|
-
puts PROMPT + to_s + ' is battling ' + newcoords_unit.to_s
|
112
|
-
newcoords_unit.destroy # TODO randomized combat
|
113
|
-
end
|
114
|
-
end
|
115
|
-
end
|
116
|
-
@moves_left -= 1
|
117
|
-
|
118
|
-
# Check if you are on an invalid type of terrain (unless transported)
|
119
|
-
unless tile_check == true
|
120
|
-
puts PROMPT + to_s + " found itself in a bad place"
|
121
|
-
destroy
|
122
|
-
end
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
|
-
|
127
|
-
def draw
|
128
|
-
@image.draw(@x * TILESIZE, (@y + 1) * TILESIZE, ZUNIT,
|
129
|
-
scale_x = 1, scale_y = 1, color = COLOUR[@faction])
|
130
|
-
end
|
131
|
-
|
132
|
-
def can_move?
|
133
|
-
(can_fly? || can_sail? || can_ride?) && @moves_left > 0
|
134
|
-
end
|
135
|
-
|
136
|
-
def can_fly?
|
137
|
-
false
|
138
|
-
end
|
139
|
-
|
140
|
-
def can_sail?
|
141
|
-
false
|
142
|
-
end
|
143
|
-
|
144
|
-
def can_ride?
|
145
|
-
false
|
146
|
-
end
|
147
|
-
|
148
|
-
def can_build?
|
149
|
-
false
|
150
|
-
end
|
151
|
-
|
152
|
-
def can_transport?
|
153
|
-
@cargo_max > 0
|
154
|
-
end
|
155
|
-
|
156
|
-
def is_full?
|
157
|
-
@cargo.size >= @cargo_max # just == should be enough
|
158
|
-
end
|
159
|
-
|
160
|
-
def is_transporting?
|
161
|
-
@cargo.size > 0
|
162
|
-
end
|
163
|
-
|
164
|
-
def is_transported?
|
165
|
-
@map.get_unit(@x, @y) != self
|
166
|
-
end
|
167
|
-
|
168
|
-
def can_capture?
|
169
|
-
false
|
170
|
-
end
|
171
|
-
|
172
|
-
def can_be_captured?
|
173
|
-
false
|
174
|
-
end
|
175
|
-
|
176
|
-
# Checks if unit is on the right type of terrain (not for transported units)
|
177
|
-
def tile_check
|
178
|
-
unless is_transported?
|
179
|
-
case @map.tile(@x, @y).terrain
|
180
|
-
when TILE_SEA
|
181
|
-
return can_fly? || can_sail?
|
182
|
-
when TILE_GROUND
|
183
|
-
return can_fly? || can_ride?
|
184
|
-
end
|
185
|
-
end
|
186
|
-
true
|
187
|
-
end
|
188
|
-
|
189
|
-
def function
|
190
|
-
@function.func
|
191
|
-
end
|
192
|
-
|
193
|
-
def set_function(func)
|
194
|
-
unless @faction == 0 # neutral faction doesn't need functions
|
195
|
-
if (func == FUNCBUILD && !can_build?)
|
196
|
-
puts PROMPT + to_s + ": this unit can't build other units"
|
197
|
-
end
|
198
|
-
|
199
|
-
if @function.func == func
|
200
|
-
puts PROMPT + to_s + ": function has already been set to #{@function.func}"
|
201
|
-
else
|
202
|
-
@function.func = func
|
203
|
-
puts PROMPT + to_s + ": function set to #{@function.func}"
|
204
|
-
end
|
205
|
-
end
|
206
|
-
end
|
207
|
-
|
208
|
-
def function!
|
209
|
-
ret = @function.func!(@x, @y, @map, @infopane)
|
210
|
-
puts to_s + ret
|
211
|
-
end
|
212
|
-
|
213
|
-
# Set short info string: type, faction, coordinates
|
214
|
-
def to_s
|
215
|
-
"#{@name} (FAC#{@faction} #{@x}-#{@y})"
|
216
|
-
end
|
217
|
-
|
218
|
-
# Set long info string: short info string, armor, moves, function, cargo
|
219
|
-
def info
|
220
|
-
ret = to_s + ": armor #{@armor_left}/#{@armor_max}"
|
221
|
-
|
222
|
-
if @moves_max > 0
|
223
|
-
ret = ret + ", moves #{@moves_left}/#{@moves_max}"
|
224
|
-
end
|
225
|
-
|
226
|
-
ret = ret + ", func #{@function.func}"
|
227
|
-
|
228
|
-
if @cargo.size > 0
|
229
|
-
ret = ret + ", transports #{@cargo.size}/#{@cargo_max} units"
|
230
|
-
end
|
231
|
-
|
232
|
-
ret
|
233
|
-
end
|
234
|
-
|
235
|
-
def reset_moves!
|
236
|
-
@moves_left = @moves_max
|
237
|
-
end
|
238
|
-
end
|
data/lib/unitFunction.rb
DELETED
@@ -1,47 +0,0 @@
|
|
1
|
-
PARTS = 3
|
2
|
-
|
3
|
-
class UnitFunction
|
4
|
-
attr_accessor :func
|
5
|
-
|
6
|
-
def initialize(function = FUNCNONE)
|
7
|
-
@func = function
|
8
|
-
end
|
9
|
-
|
10
|
-
def func!(xx, yy, map, infopane)
|
11
|
-
ret = " didn't actually do anything (ERROR)"
|
12
|
-
|
13
|
-
unit = map.get_unit(xx, yy)
|
14
|
-
if !unit
|
15
|
-
abort("unitFunction.func!(): Functioning unit not found at given coordinates (#{xx}-#{yy})")
|
16
|
-
end
|
17
|
-
|
18
|
-
case @func
|
19
|
-
# Build given unit
|
20
|
-
when FUNCBUILD
|
21
|
-
if(unit.parts_built >= PARTS) # just == should be enough
|
22
|
-
ret = " completed building of army"
|
23
|
-
unit.parts_built = 0
|
24
|
-
Army.new(unit.x, unit.y, unit.faction, map, infopane) # TODO allow setting what to build
|
25
|
-
else
|
26
|
-
ret = " built next part of army"
|
27
|
-
unit.parts_built = unit.parts_built + 1
|
28
|
-
end
|
29
|
-
|
30
|
-
# Wake up when enemies are nearby
|
31
|
-
when FUNCSENTRY
|
32
|
-
units_around = map.all_units.select { |uu|
|
33
|
-
(uu.x - xx).abs <= 1 &&
|
34
|
-
(uu.y - yy).abs <= 1 &&
|
35
|
-
uu.faction != unit.faction
|
36
|
-
}
|
37
|
-
if units_around.size > 0
|
38
|
-
ret = " woke up"
|
39
|
-
@func = FUNCNONE
|
40
|
-
else
|
41
|
-
ret = " was on sentry duty"
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
ret
|
46
|
-
end
|
47
|
-
end
|