Merge lp:~widelands-dev/widelands/bridges into lp:widelands
- bridges
- Merge into trunk
Status: | Work in progress | ||||
---|---|---|---|---|---|
Proposed branch: | lp:~widelands-dev/widelands/bridges | ||||
Merge into: | lp:widelands | ||||
Prerequisite: | lp:~widelands-dev/widelands/ferry | ||||
Diff against target: |
608 lines (+284/-6) 15 files modified
data/tribes/atlanteans.lua (+32/-0) data/tribes/barbarians.lua (+28/-0) data/tribes/empire.lua (+28/-0) data/tribes/frisians.lua (+28/-0) src/economy/roadbase.cc (+79/-2) src/economy/roadbase.h (+4/-0) src/graphic/gl/road_program.cc (+6/-3) src/logic/map_objects/bob.cc (+18/-0) src/logic/map_objects/tribes/tribe_descr.cc (+23/-1) src/logic/map_objects/tribes/tribe_descr.h (+11/-0) src/logic/roadtype.h (+2/-0) src/wui/interactive_base.cc (+21/-0) src/wui/interactive_base.h (+2/-0) src/wui/interactive_player.cc (+1/-0) src/wui/interactive_spectator.cc (+1/-0) |
||||
To merge this branch: | bzr merge lp:~widelands-dev/widelands/bridges | ||||
Related bugs: |
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
kaputtnik (community) | Needs Fixing | ||
GunChleoc | Approve | ||
Review via email: mp+364318@code.launchpad.net |
Commit message
Roads where both adjacent triangles are unwalkable are displayed as bridges
Description of the change
The current road rendering system is too inflexible for this feature. I already had to rework it in the ferry branch to make waterways possible, and I´m using these changes here. So this is a follow-up of the ferries.
Every tribe has its own images for a normal and a busy bridge. Bridges may also be animated. They have a height, which is visible when bobs walk over the bridge.
Benedikt Straub (nordfriese) wrote : | # |
Replied to diff comments
GunChleoc (gunchleoc) : | # |
bunnybot (widelandsofficial) wrote : | # |
Continuous integration builds have changed state:
Travis build 4609. State: failed. Details: https:/
Appveyor build 4396. State: failed. Details: https:/
hessenfarmer (stephan-lutz) wrote : | # |
you need to merge trunk to make appveyor happy and working
bunnybot (widelandsofficial) wrote : | # |
Continuous integration builds have changed state:
Travis build 4615. State: passed. Details: https:/
Appveyor build 4402. State: success. Details: https:/
GunChleoc (gunchleoc) wrote : | # |
I have fixed 2 compiler warnings. You need to use the PRIuS macro for logging size_t, because the exact data type depends on the operating system. Also, uint8_t will be interpreted as a character code point rather than a number, so it needs an annoying explicit cast to <unsigned int> every time you want to print it.
I am getting a failed assert:
widelands: ../src/
This happened after starting a new game with all 4 tribes in Archipelago Sea, and the AI built something somewhere.
Benedikt Straub (nordfriese) wrote : | # |
Fixed the assert. Thanks for taking care of the warnings :)
GunChleoc (gunchleoc) wrote : | # |
Done a bit of testing ad it looks fine.
There is 2 small z-layering glitch for bridges going north-south: Workers walking on roads behind them to their upper flag are blitted after the bridge is, so they appear to be on top of it. It's not a biggie though and shouldn't block this branch.
bunnybot (widelandsofficial) wrote : | # |
Continuous integration builds have changed state:
Travis build 4626. State: passed. Details: https:/
Appveyor build 4413. State: failed. Details: https:/
bunnybot (widelandsofficial) wrote : | # |
Continuous integration builds have changed state:
Travis build 4651. State: failed. Details: https:/
Appveyor build 4438. State: failed. Details: https:/
bunnybot (widelandsofficial) wrote : | # |
Continuous integration builds have changed state:
Travis build 4652. State: errored. Details: https:/
Appveyor build 4439. State: success. Details: https:/
kaputtnik (franku) wrote : | # |
I get an error when trying to load this savegame:
https:/
This savegame was made close before the other one. The difference is this savegame has no waterway yet. The other savegame has a waterway, which has no ferry: https:/
kaputtnik (franku) wrote : | # |
Forget: To reproduce
1. load 'test_ferries.wgf'
2. Build a waterway from flag 30,28 to node 31,27
3. Save the game
4. Try to load the previous saved game
Benedikt Straub (nordfriese) wrote : | # |
Thanks for reporting, I pushed a fix for the bug. It was a small error in the loading code; the savegame can now be loaded.
bunnybot (widelandsofficial) wrote : | # |
Continuous integration builds have changed state:
Travis build 4668. State: failed. Details: https:/
Appveyor build 4454. State: success. Details: https:/
kaputtnik (franku) wrote : | # |
Maybe i should test the ferrys in the appropriate branch... can't get them to work...
Regarding the bridges i think having a bridge for normal roads which looks more like a wooden footbridge would be nicer.
Lifting the workers when walking over the bridge is really nice :)
bunnybot (widelandsofficial) wrote : | # |
Continuous integration builds have changed state:
Travis build 4838. State: failed. Details: https:/
Appveyor build 4619. State: failed. Details: https:/
bunnybot (widelandsofficial) wrote : | # |
Continuous integration builds have changed state:
Travis build 4841. State: passed. Details: https:/
Appveyor build 4622. State: success. Details: https:/
Klaus Halfmann (klaus-halfmann) wrote : | # |
Now, can ths be merged or do we want another review?
Benedikt Straub (nordfriese) wrote : | # |
The ferry branch needs to be merged first because this one is stacked on it.
Klaus Halfmann (klaus-halfmann) wrote : | # |
Mhhh, We could iprove the RoadType via 4 bitflags and some inline fucntions:
1000
^ Road
^ Bridge
^ Waterway
^ Busy
kRoad = 1
kNormalRoad = 1
kBusyRoad = 9
kBridge = 2
kBridgeNormal = 2
kBridgeBusy = 10
kWaterway = 4
kNormalWaterway = 4
kBusyWaterway = 12
kBusy = 8
This woud avoid a lot of if(this && that || soemthingElse) code?
Once this is in I would address SirVers TODO and extract some RoadDirection enum
Benedikt Straub (nordfriese) wrote : | # |
I already reworked that whole stuff in a different way for the ferries. The TODO I think you´re referring to is also solved there already. I prefer my solution because it gets rid of this bitwise hacking, and there´s no need to invent the wheel twice…
GunChleoc (gunchleoc) wrote : | # |
Yep, let's wait for the ferry branch and do a final round of code review and testing in this branch when that's done.
bunnybot (widelandsofficial) wrote : | # |
Continuous integration builds have changed state:
Travis build 5063. State: failed. Details: https:/
Appveyor build 4843. State: success. Details: https:/
bunnybot (widelandsofficial) wrote : | # |
Continuous integration builds have changed state:
Travis build 5186. State: failed. Details: https:/
Appveyor build 4966. State: failed. Details: https:/
Preview Diff
1 | === modified file 'data/tribes/atlanteans.lua' |
2 | --- data/tribes/atlanteans.lua 2019-06-21 06:44:40 +0000 |
3 | +++ data/tribes/atlanteans.lua 2019-06-21 06:44:43 +0000 |
4 | @@ -17,6 +17,10 @@ |
5 | -- |
6 | -- **animations**: Global animations. Contains subtables for ``frontier`` and ``flag``. Each animation needs the parameters ``pictures`` (table of filenames) and ``hotspot`` (2 integer coordinates), and may also define ``fps`` (integer frames per second). |
7 | -- |
8 | +-- **bridges**: Contains animations for ``normal_e``, ``normal_se``, ``normal_sw``, ``busy_e``, ``busy_se`` and ``busy_sw``. |
9 | +-- |
10 | +-- **bridge_height**: The height in pixels of each bridge at it's summit at 1x scale. |
11 | +-- |
12 | -- **roads**: The file paths for the tribe's road textures in 3 subtables ``busy``, ``normal`` and ``waterway``. |
13 | -- |
14 | -- **resource_indicators**: The names for the resource indicators. This table contains a subtable for each resource name plus a subtable named "" for no resources. Each subtable is an array, in which the index of each entry is the highest amount of resources the indicator may indicate. |
15 | @@ -57,6 +61,34 @@ |
16 | name = "atlanteans", |
17 | animations = animations, |
18 | |
19 | + bridges = { |
20 | + normal_e = { |
21 | + pictures = path.list_files (dirname .. "images/atlanteans/bridge_normal_e_?.png"), |
22 | + hotspot = { -2, 11 }, |
23 | + }, |
24 | + normal_se = { |
25 | + pictures = path.list_files (dirname .. "images/atlanteans/bridge_normal_se_?.png"), |
26 | + hotspot = { 5, 2 }, |
27 | + }, |
28 | + normal_sw = { |
29 | + pictures = path.list_files (dirname .. "images/atlanteans/bridge_normal_sw_?.png"), |
30 | + hotspot = { 36, 3 }, |
31 | + }, |
32 | + busy_e = { |
33 | + pictures = path.list_files (dirname .. "images/atlanteans/bridge_busy_e_?.png"), |
34 | + hotspot = { -2, 11 }, |
35 | + }, |
36 | + busy_se = { |
37 | + pictures = path.list_files (dirname .. "images/atlanteans/bridge_busy_se_?.png"), |
38 | + hotspot = { 5, 2 }, |
39 | + }, |
40 | + busy_sw = { |
41 | + pictures = path.list_files (dirname .. "images/atlanteans/bridge_busy_sw_?.png"), |
42 | + hotspot = { 36, 3 }, |
43 | + }, |
44 | + }, |
45 | + bridge_height = 8, |
46 | + |
47 | -- Image file paths for this tribe's road and waterway textures |
48 | roads = { |
49 | busy = { |
50 | |
51 | === modified file 'data/tribes/barbarians.lua' |
52 | --- data/tribes/barbarians.lua 2019-06-21 06:44:40 +0000 |
53 | +++ data/tribes/barbarians.lua 2019-06-21 06:44:43 +0000 |
54 | @@ -8,6 +8,34 @@ |
55 | name = "barbarians", |
56 | animations = animations, |
57 | |
58 | + bridges = { |
59 | + normal_e = { |
60 | + pictures = path.list_files (dirname .. "images/barbarians/bridge_normal_e_?.png"), |
61 | + hotspot = { -1, 13 }, |
62 | + }, |
63 | + normal_se = { |
64 | + pictures = path.list_files (dirname .. "images/barbarians/bridge_normal_se_?.png"), |
65 | + hotspot = { 8, 3 }, |
66 | + }, |
67 | + normal_sw = { |
68 | + pictures = path.list_files (dirname .. "images/barbarians/bridge_normal_sw_?.png"), |
69 | + hotspot = { 41, 3 }, |
70 | + }, |
71 | + busy_e = { |
72 | + pictures = path.list_files (dirname .. "images/barbarians/bridge_busy_e_?.png"), |
73 | + hotspot = { -1, 13 }, |
74 | + }, |
75 | + busy_se = { |
76 | + pictures = path.list_files (dirname .. "images/barbarians/bridge_busy_se_?.png"), |
77 | + hotspot = { 8, 3 }, |
78 | + }, |
79 | + busy_sw = { |
80 | + pictures = path.list_files (dirname .. "images/barbarians/bridge_busy_sw_?.png"), |
81 | + hotspot = { 41, 3 }, |
82 | + }, |
83 | + }, |
84 | + bridge_height = 8, |
85 | + |
86 | -- Image file paths for this tribe's road and waterway textures |
87 | roads = { |
88 | busy = { |
89 | |
90 | === modified file 'data/tribes/empire.lua' |
91 | --- data/tribes/empire.lua 2019-06-21 06:44:40 +0000 |
92 | +++ data/tribes/empire.lua 2019-06-21 06:44:43 +0000 |
93 | @@ -8,6 +8,34 @@ |
94 | name = "empire", |
95 | animations = animations, |
96 | |
97 | + bridges = { |
98 | + normal_e = { |
99 | + pictures = path.list_files (dirname .. "images/empire/bridge_normal_e_?.png"), |
100 | + hotspot = { -2, 12 }, |
101 | + }, |
102 | + normal_se = { |
103 | + pictures = path.list_files (dirname .. "images/empire/bridge_normal_se_?.png"), |
104 | + hotspot = { 5, 2 }, |
105 | + }, |
106 | + normal_sw = { |
107 | + pictures = path.list_files (dirname .. "images/empire/bridge_normal_sw_?.png"), |
108 | + hotspot = { 36, 3 }, |
109 | + }, |
110 | + busy_e = { |
111 | + pictures = path.list_files (dirname .. "images/empire/bridge_busy_e_?.png"), |
112 | + hotspot = { -2, 12 }, |
113 | + }, |
114 | + busy_se = { |
115 | + pictures = path.list_files (dirname .. "images/empire/bridge_busy_se_?.png"), |
116 | + hotspot = { 5, 2 }, |
117 | + }, |
118 | + busy_sw = { |
119 | + pictures = path.list_files (dirname .. "images/empire/bridge_busy_sw_?.png"), |
120 | + hotspot = { 36, 3 }, |
121 | + }, |
122 | + }, |
123 | + bridge_height = 8, |
124 | + |
125 | -- Image file paths for this tribe's road and waterway textures |
126 | roads = { |
127 | busy = { |
128 | |
129 | === modified file 'data/tribes/frisians.lua' |
130 | --- data/tribes/frisians.lua 2019-06-21 06:44:40 +0000 |
131 | +++ data/tribes/frisians.lua 2019-06-21 06:44:43 +0000 |
132 | @@ -8,6 +8,34 @@ |
133 | name = "frisians", |
134 | animations = animations, |
135 | |
136 | + bridges = { |
137 | + normal_e = { |
138 | + pictures = path.list_files (dirname .. "images/frisians/bridge_normal_e_?.png"), |
139 | + hotspot = { -2, 12 }, |
140 | + }, |
141 | + normal_se = { |
142 | + pictures = path.list_files (dirname .. "images/frisians/bridge_normal_se_?.png"), |
143 | + hotspot = { 5, 2 }, |
144 | + }, |
145 | + normal_sw = { |
146 | + pictures = path.list_files (dirname .. "images/frisians/bridge_normal_sw_?.png"), |
147 | + hotspot = { 36, 3 }, |
148 | + }, |
149 | + busy_e = { |
150 | + pictures = path.list_files (dirname .. "images/frisians/bridge_busy_e_?.png"), |
151 | + hotspot = { -2, 12 }, |
152 | + }, |
153 | + busy_se = { |
154 | + pictures = path.list_files (dirname .. "images/frisians/bridge_busy_se_?.png"), |
155 | + hotspot = { 5, 2 }, |
156 | + }, |
157 | + busy_sw = { |
158 | + pictures = path.list_files (dirname .. "images/frisians/bridge_busy_sw_?.png"), |
159 | + hotspot = { 36, 3 }, |
160 | + }, |
161 | + }, |
162 | + bridge_height = 8, |
163 | + |
164 | -- Image file paths for this tribe's road and waterway textures |
165 | roads = { |
166 | busy = { |
167 | |
168 | === added file 'data/tribes/images/atlanteans/bridge_busy_e_0.png' |
169 | Binary files data/tribes/images/atlanteans/bridge_busy_e_0.png 1970-01-01 00:00:00 +0000 and data/tribes/images/atlanteans/bridge_busy_e_0.png 2019-06-21 06:44:43 +0000 differ |
170 | === added file 'data/tribes/images/atlanteans/bridge_busy_se_0.png' |
171 | Binary files data/tribes/images/atlanteans/bridge_busy_se_0.png 1970-01-01 00:00:00 +0000 and data/tribes/images/atlanteans/bridge_busy_se_0.png 2019-06-21 06:44:43 +0000 differ |
172 | === added file 'data/tribes/images/atlanteans/bridge_busy_sw_0.png' |
173 | Binary files data/tribes/images/atlanteans/bridge_busy_sw_0.png 1970-01-01 00:00:00 +0000 and data/tribes/images/atlanteans/bridge_busy_sw_0.png 2019-06-21 06:44:43 +0000 differ |
174 | === added file 'data/tribes/images/atlanteans/bridge_normal_e_0.png' |
175 | Binary files data/tribes/images/atlanteans/bridge_normal_e_0.png 1970-01-01 00:00:00 +0000 and data/tribes/images/atlanteans/bridge_normal_e_0.png 2019-06-21 06:44:43 +0000 differ |
176 | === added file 'data/tribes/images/atlanteans/bridge_normal_se_0.png' |
177 | Binary files data/tribes/images/atlanteans/bridge_normal_se_0.png 1970-01-01 00:00:00 +0000 and data/tribes/images/atlanteans/bridge_normal_se_0.png 2019-06-21 06:44:43 +0000 differ |
178 | === added file 'data/tribes/images/atlanteans/bridge_normal_sw_0.png' |
179 | Binary files data/tribes/images/atlanteans/bridge_normal_sw_0.png 1970-01-01 00:00:00 +0000 and data/tribes/images/atlanteans/bridge_normal_sw_0.png 2019-06-21 06:44:43 +0000 differ |
180 | === added file 'data/tribes/images/barbarians/bridge_busy_e_0.png' |
181 | Binary files data/tribes/images/barbarians/bridge_busy_e_0.png 1970-01-01 00:00:00 +0000 and data/tribes/images/barbarians/bridge_busy_e_0.png 2019-06-21 06:44:43 +0000 differ |
182 | === added file 'data/tribes/images/barbarians/bridge_busy_se_0.png' |
183 | Binary files data/tribes/images/barbarians/bridge_busy_se_0.png 1970-01-01 00:00:00 +0000 and data/tribes/images/barbarians/bridge_busy_se_0.png 2019-06-21 06:44:43 +0000 differ |
184 | === added file 'data/tribes/images/barbarians/bridge_busy_sw_0.png' |
185 | Binary files data/tribes/images/barbarians/bridge_busy_sw_0.png 1970-01-01 00:00:00 +0000 and data/tribes/images/barbarians/bridge_busy_sw_0.png 2019-06-21 06:44:43 +0000 differ |
186 | === added file 'data/tribes/images/barbarians/bridge_normal_e_0.png' |
187 | Binary files data/tribes/images/barbarians/bridge_normal_e_0.png 1970-01-01 00:00:00 +0000 and data/tribes/images/barbarians/bridge_normal_e_0.png 2019-06-21 06:44:43 +0000 differ |
188 | === added file 'data/tribes/images/barbarians/bridge_normal_se_0.png' |
189 | Binary files data/tribes/images/barbarians/bridge_normal_se_0.png 1970-01-01 00:00:00 +0000 and data/tribes/images/barbarians/bridge_normal_se_0.png 2019-06-21 06:44:43 +0000 differ |
190 | === added file 'data/tribes/images/barbarians/bridge_normal_sw_0.png' |
191 | Binary files data/tribes/images/barbarians/bridge_normal_sw_0.png 1970-01-01 00:00:00 +0000 and data/tribes/images/barbarians/bridge_normal_sw_0.png 2019-06-21 06:44:43 +0000 differ |
192 | === added file 'data/tribes/images/empire/bridge_busy_e_0.png' |
193 | Binary files data/tribes/images/empire/bridge_busy_e_0.png 1970-01-01 00:00:00 +0000 and data/tribes/images/empire/bridge_busy_e_0.png 2019-06-21 06:44:43 +0000 differ |
194 | === added file 'data/tribes/images/empire/bridge_busy_se_0.png' |
195 | Binary files data/tribes/images/empire/bridge_busy_se_0.png 1970-01-01 00:00:00 +0000 and data/tribes/images/empire/bridge_busy_se_0.png 2019-06-21 06:44:43 +0000 differ |
196 | === added file 'data/tribes/images/empire/bridge_busy_sw_0.png' |
197 | Binary files data/tribes/images/empire/bridge_busy_sw_0.png 1970-01-01 00:00:00 +0000 and data/tribes/images/empire/bridge_busy_sw_0.png 2019-06-21 06:44:43 +0000 differ |
198 | === added file 'data/tribes/images/empire/bridge_normal_e_0.png' |
199 | Binary files data/tribes/images/empire/bridge_normal_e_0.png 1970-01-01 00:00:00 +0000 and data/tribes/images/empire/bridge_normal_e_0.png 2019-06-21 06:44:43 +0000 differ |
200 | === added file 'data/tribes/images/empire/bridge_normal_se_0.png' |
201 | Binary files data/tribes/images/empire/bridge_normal_se_0.png 1970-01-01 00:00:00 +0000 and data/tribes/images/empire/bridge_normal_se_0.png 2019-06-21 06:44:43 +0000 differ |
202 | === added file 'data/tribes/images/empire/bridge_normal_sw_0.png' |
203 | Binary files data/tribes/images/empire/bridge_normal_sw_0.png 1970-01-01 00:00:00 +0000 and data/tribes/images/empire/bridge_normal_sw_0.png 2019-06-21 06:44:43 +0000 differ |
204 | === added file 'data/tribes/images/frisians/bridge_busy_e_0.png' |
205 | Binary files data/tribes/images/frisians/bridge_busy_e_0.png 1970-01-01 00:00:00 +0000 and data/tribes/images/frisians/bridge_busy_e_0.png 2019-06-21 06:44:43 +0000 differ |
206 | === added file 'data/tribes/images/frisians/bridge_busy_se_0.png' |
207 | Binary files data/tribes/images/frisians/bridge_busy_se_0.png 1970-01-01 00:00:00 +0000 and data/tribes/images/frisians/bridge_busy_se_0.png 2019-06-21 06:44:43 +0000 differ |
208 | === added file 'data/tribes/images/frisians/bridge_busy_sw_0.png' |
209 | Binary files data/tribes/images/frisians/bridge_busy_sw_0.png 1970-01-01 00:00:00 +0000 and data/tribes/images/frisians/bridge_busy_sw_0.png 2019-06-21 06:44:43 +0000 differ |
210 | === added file 'data/tribes/images/frisians/bridge_normal_e_0.png' |
211 | Binary files data/tribes/images/frisians/bridge_normal_e_0.png 1970-01-01 00:00:00 +0000 and data/tribes/images/frisians/bridge_normal_e_0.png 2019-06-21 06:44:43 +0000 differ |
212 | === added file 'data/tribes/images/frisians/bridge_normal_se_0.png' |
213 | Binary files data/tribes/images/frisians/bridge_normal_se_0.png 1970-01-01 00:00:00 +0000 and data/tribes/images/frisians/bridge_normal_se_0.png 2019-06-21 06:44:43 +0000 differ |
214 | === added file 'data/tribes/images/frisians/bridge_normal_sw_0.png' |
215 | Binary files data/tribes/images/frisians/bridge_normal_sw_0.png 1970-01-01 00:00:00 +0000 and data/tribes/images/frisians/bridge_normal_sw_0.png 2019-06-21 06:44:43 +0000 differ |
216 | === modified file 'src/economy/roadbase.cc' |
217 | --- src/economy/roadbase.cc 2019-06-21 06:44:40 +0000 |
218 | +++ src/economy/roadbase.cc 2019-06-21 06:44:43 +0000 |
219 | @@ -28,6 +28,8 @@ |
220 | #include "logic/map_objects/map_object.h" |
221 | #include "logic/map_objects/tribes/carrier.h" |
222 | #include "logic/map_objects/tribes/tribe_descr.h" |
223 | +#include "logic/map_objects/world/terrain_description.h" |
224 | +#include "logic/map_objects/world/world.h" |
225 | #include "logic/player.h" |
226 | |
227 | namespace Widelands { |
228 | @@ -69,6 +71,68 @@ |
229 | return *flags_[FlagStart]; |
230 | } |
231 | |
232 | +// This returns true if and only if this is a road that covers the specified edge and |
233 | +// both triangles adjacent to that edge are unwalkable |
234 | +bool RoadBase::is_bridge(const EditorGameBase& egbase, const FCoords& field, uint8_t dir) const { |
235 | + if (descr().type() != MapObjectType::ROAD) { |
236 | + // waterways can't be bridges... |
237 | + return false; |
238 | + } |
239 | + |
240 | + const Map& map = egbase.map(); |
241 | + |
242 | + FCoords iterate = map.get_fcoords(path_.get_start()); |
243 | + const Path::StepVector::size_type nr_steps = path_.get_nsteps(); |
244 | + bool found = false; |
245 | + for (Path::StepVector::size_type i = 0; i <= nr_steps; ++i) { |
246 | + if (iterate == field) { |
247 | + if ((i < nr_steps && path_[i] == dir) || (i > 0 && path_[i - 1] == get_reverse_dir(dir))) { |
248 | + found = true; |
249 | + break; |
250 | + } |
251 | + return false; |
252 | + } |
253 | + if (i < nr_steps) { |
254 | + map.get_neighbour(iterate, path_[i], &iterate); |
255 | + } |
256 | + } |
257 | + if (!found) { |
258 | + return false; |
259 | + } |
260 | + |
261 | + FCoords fr, fd; |
262 | + switch (dir) { |
263 | + case WALK_SW: |
264 | + fd = field; |
265 | + map.get_ln(field, &fr); |
266 | + break; |
267 | + case WALK_SE: |
268 | + fd = field; |
269 | + fr = field; |
270 | + break; |
271 | + case WALK_NW: |
272 | + map.get_tln(field, &fd); |
273 | + fr = fd; |
274 | + break; |
275 | + case WALK_NE: |
276 | + map.get_trn(field, &fd); |
277 | + map.get_tln(field, &fr); |
278 | + break; |
279 | + case WALK_W: |
280 | + map.get_tln(field, &fd); |
281 | + map.get_ln(field, &fr); |
282 | + break; |
283 | + case WALK_E: |
284 | + map.get_trn(field, &fd); |
285 | + fr = field; |
286 | + break; |
287 | + default: |
288 | + NEVER_HERE(); |
289 | + } |
290 | + return (egbase.world().terrain_descr(fd.field->terrain_d()).get_is() & TerrainDescription::Is::kUnwalkable) && |
291 | + (egbase.world().terrain_descr(fr.field->terrain_r()).get_is() & TerrainDescription::Is::kUnwalkable); |
292 | +} |
293 | + |
294 | /** |
295 | * Return the cost of getting from fromflag to the other flag. |
296 | */ |
297 | @@ -92,9 +156,22 @@ |
298 | idle_index_ = path.get_nsteps() / 2; |
299 | } |
300 | |
301 | -static inline void set_roadtype(EditorGameBase& egbase, const FCoords curf, uint8_t dir, RoadType type) { |
302 | - if (dir == WALK_SW || dir == WALK_SE || dir == WALK_E) |
303 | +inline void RoadBase::set_roadtype(EditorGameBase& egbase, const FCoords curf, uint8_t dir, RoadType type) const { |
304 | + if (dir == WALK_SW || dir == WALK_SE || dir == WALK_E) { |
305 | + if (type != RoadType::kNone && is_bridge(egbase, curf, dir)) { |
306 | + switch (type) { |
307 | + case RoadType::kNormal: |
308 | + type = RoadType::kBridgeNormal; |
309 | + break; |
310 | + case RoadType::kBusy: |
311 | + type = RoadType::kBridgeBusy; |
312 | + break; |
313 | + default: |
314 | + NEVER_HERE(); |
315 | + } |
316 | + } |
317 | egbase.set_road(curf, dir, type); |
318 | + } |
319 | } |
320 | |
321 | /** |
322 | |
323 | === modified file 'src/economy/roadbase.h' |
324 | --- src/economy/roadbase.h 2019-06-21 06:44:40 +0000 |
325 | +++ src/economy/roadbase.h 2019-06-21 06:44:43 +0000 |
326 | @@ -68,6 +68,8 @@ |
327 | return type_; |
328 | } |
329 | |
330 | + bool is_bridge(const EditorGameBase&, const FCoords&, uint8_t) const; |
331 | + |
332 | int32_t get_size() const override; |
333 | bool get_passable() const override; |
334 | PositionList get_positions(const EditorGameBase&) const override; |
335 | @@ -107,6 +109,8 @@ |
336 | |
337 | virtual void link_into_flags(EditorGameBase&, bool = false); |
338 | |
339 | + inline void set_roadtype(EditorGameBase& egbase, const FCoords curf, uint8_t dir, RoadType type) const; |
340 | + |
341 | Flag* flags_[2]; ///< start and end flag |
342 | int32_t flagidx_[2]; ///< index of this road in the flag's road array |
343 | |
344 | |
345 | === modified file 'src/graphic/gl/road_program.cc' |
346 | --- src/graphic/gl/road_program.cc 2019-06-21 06:44:40 +0000 |
347 | +++ src/graphic/gl/road_program.cc 2019-06-21 06:44:43 +0000 |
348 | @@ -156,7 +156,8 @@ |
349 | // Road to right neighbor. |
350 | if (field.rn_index != FieldsToDraw::kInvalidIndex) { |
351 | const Widelands::RoadType road = static_cast<Widelands::RoadType>(field.road_e); |
352 | - if (road != Widelands::RoadType::kNone) { |
353 | + if (road != Widelands::RoadType::kNone && road != Widelands::RoadType::kBridgeNormal && |
354 | + road != Widelands::RoadType::kBridgeBusy) { |
355 | add_road(renderbuffer_width, renderbuffer_height, field, |
356 | fields_to_draw.at(field.rn_index), scale, road, kEast, &gl_texture); |
357 | } |
358 | @@ -165,7 +166,8 @@ |
359 | // Road to bottom right neighbor. |
360 | if (field.brn_index != FieldsToDraw::kInvalidIndex) { |
361 | const Widelands::RoadType road = static_cast<Widelands::RoadType>(field.road_se); |
362 | - if (road != Widelands::RoadType::kNone) { |
363 | + if (road != Widelands::RoadType::kNone && road != Widelands::RoadType::kBridgeNormal && |
364 | + road != Widelands::RoadType::kBridgeBusy) { |
365 | add_road(renderbuffer_width, renderbuffer_height, field, |
366 | fields_to_draw.at(field.brn_index), scale, road, kSouthEast, &gl_texture); |
367 | } |
368 | @@ -174,7 +176,8 @@ |
369 | // Road to bottom left neighbor. |
370 | if (field.bln_index != FieldsToDraw::kInvalidIndex) { |
371 | const Widelands::RoadType road = static_cast<Widelands::RoadType>(field.road_sw); |
372 | - if (road != Widelands::RoadType::kNone) { |
373 | + if (road != Widelands::RoadType::kNone && road != Widelands::RoadType::kBridgeNormal && |
374 | + road != Widelands::RoadType::kBridgeBusy) { |
375 | add_road(renderbuffer_width, renderbuffer_height, field, |
376 | fields_to_draw.at(field.bln_index), scale, road, kSouthWest, &gl_texture); |
377 | } |
378 | |
379 | === modified file 'src/logic/map_objects/bob.cc' |
380 | --- src/logic/map_objects/bob.cc 2019-05-11 13:48:12 +0000 |
381 | +++ src/logic/map_objects/bob.cc 2019-06-21 06:44:43 +0000 |
382 | @@ -27,6 +27,7 @@ |
383 | #include "base/macros.h" |
384 | #include "base/math.h" |
385 | #include "base/wexception.h" |
386 | +#include "economy/roadbase.h" |
387 | #include "economy/route.h" |
388 | #include "economy/transfer.h" |
389 | #include "graphic/rendertarget.h" |
390 | @@ -705,34 +706,47 @@ |
391 | const float triangle_w = kTriangleWidth * scale; |
392 | const float triangle_h = kTriangleHeight * scale; |
393 | |
394 | + bool bridge = false; |
395 | switch (walking_) { |
396 | case WALK_NW: |
397 | map.get_brn(end, &start); |
398 | spos.x += triangle_w / 2.f; |
399 | spos.y += triangle_h; |
400 | + bridge = end.field->road_southeast == RoadType::kBridgeNormal || |
401 | + end.field->road_southeast == RoadType::kBridgeBusy; |
402 | break; |
403 | case WALK_NE: |
404 | map.get_bln(end, &start); |
405 | spos.x -= triangle_w / 2.f; |
406 | spos.y += triangle_h; |
407 | + bridge = end.field->road_southwest == RoadType::kBridgeNormal || |
408 | + end.field->road_southwest == RoadType::kBridgeBusy; |
409 | break; |
410 | case WALK_W: |
411 | map.get_rn(end, &start); |
412 | spos.x += triangle_w; |
413 | + bridge = end.field->road_east == RoadType::kBridgeNormal || |
414 | + end.field->road_east == RoadType::kBridgeBusy; |
415 | break; |
416 | case WALK_E: |
417 | map.get_ln(end, &start); |
418 | spos.x -= triangle_w; |
419 | + bridge = start.field->road_east == RoadType::kBridgeNormal || |
420 | + start.field->road_east == RoadType::kBridgeBusy; |
421 | break; |
422 | case WALK_SW: |
423 | map.get_trn(end, &start); |
424 | spos.x += triangle_w / 2.f; |
425 | spos.y -= triangle_h; |
426 | + bridge = start.field->road_southwest == RoadType::kBridgeNormal || |
427 | + start.field->road_southwest == RoadType::kBridgeBusy; |
428 | break; |
429 | case WALK_SE: |
430 | map.get_tln(end, &start); |
431 | spos.x -= triangle_w / 2.f; |
432 | spos.y -= triangle_h; |
433 | + bridge = start.field->road_southeast == RoadType::kBridgeNormal || |
434 | + start.field->road_southeast == RoadType::kBridgeBusy; |
435 | break; |
436 | |
437 | case IDLE: |
438 | @@ -750,6 +764,10 @@ |
439 | static_cast<float>(game.get_gametime() - walkstart_) / (walkend_ - walkstart_), 0.f, 1.f); |
440 | epos.x = f * epos.x + (1.f - f) * spos.x; |
441 | epos.y = f * epos.y + (1.f - f) * spos.y; |
442 | + if (bridge) { |
443 | + epos.y -= game.player(end.field->get_owned_by()).tribe().bridge_height() * scale * |
444 | + (1 - 4 * (f - 0.5f) * (f - 0.5f)); |
445 | + } |
446 | } |
447 | return epos; |
448 | } |
449 | |
450 | === modified file 'src/logic/map_objects/tribes/tribe_descr.cc' |
451 | --- src/logic/map_objects/tribes/tribe_descr.cc 2019-06-21 06:44:40 +0000 |
452 | +++ src/logic/map_objects/tribes/tribe_descr.cc 2019-06-21 06:44:43 +0000 |
453 | @@ -57,7 +57,8 @@ |
454 | TribeDescr::TribeDescr(const LuaTable& table, |
455 | const Widelands::TribeBasicInfo& info, |
456 | const Tribes& init_tribes) |
457 | - : name_(table.get_string("name")), descname_(info.descname), tribes_(init_tribes) { |
458 | + : name_(table.get_string("name")), descname_(info.descname), tribes_(init_tribes), |
459 | + bridge_height_(table.get_int("bridge_height")) { |
460 | |
461 | try { |
462 | initializations_ = info.initializations; |
463 | @@ -74,6 +75,14 @@ |
464 | animations_table->get_string("basename")); |
465 | } |
466 | |
467 | + items_table = table.get_table("bridges"); |
468 | + bridge_e_animation_normal_id_ = g_gr->animations().load(*items_table->get_table("normal_e")); |
469 | + bridge_se_animation_normal_id_ = g_gr->animations().load(*items_table->get_table("normal_se")); |
470 | + bridge_sw_animation_normal_id_ = g_gr->animations().load(*items_table->get_table("normal_sw")); |
471 | + bridge_e_animation_busy_id_ = g_gr->animations().load(*items_table->get_table("busy_e")); |
472 | + bridge_se_animation_busy_id_ = g_gr->animations().load(*items_table->get_table("busy_se")); |
473 | + bridge_sw_animation_busy_id_ = g_gr->animations().load(*items_table->get_table("busy_sw")); |
474 | + |
475 | items_table = table.get_table("roads"); |
476 | const auto load_roads = [&items_table]( |
477 | const std::string& road_type, std::vector<std::string>* images) { |
478 | @@ -363,6 +372,19 @@ |
479 | return flag_animation_id_; |
480 | } |
481 | |
482 | +uint32_t TribeDescr::bridge_animation(uint8_t dir, bool busy) const { |
483 | + switch (dir) { |
484 | + case WALK_E: return busy ? bridge_e_animation_busy_id_ : bridge_e_animation_normal_id_; |
485 | + case WALK_SE: return busy ? bridge_se_animation_busy_id_ : bridge_se_animation_normal_id_; |
486 | + case WALK_SW: return busy ? bridge_sw_animation_busy_id_ : bridge_sw_animation_normal_id_; |
487 | + default: NEVER_HERE(); |
488 | + } |
489 | +} |
490 | + |
491 | +uint32_t TribeDescr::bridge_height() const { |
492 | + return bridge_height_; |
493 | +} |
494 | + |
495 | const std::vector<std::string>& TribeDescr::normal_road_paths() const { |
496 | return normal_road_paths_; |
497 | } |
498 | |
499 | === modified file 'src/logic/map_objects/tribes/tribe_descr.h' |
500 | --- src/logic/map_objects/tribes/tribe_descr.h 2019-06-21 06:44:40 +0000 |
501 | +++ src/logic/map_objects/tribes/tribe_descr.h 2019-06-21 06:44:43 +0000 |
502 | @@ -127,6 +127,10 @@ |
503 | |
504 | uint32_t frontier_animation() const; |
505 | uint32_t flag_animation() const; |
506 | + uint32_t bridge_animation(uint8_t dir, bool busy) const; |
507 | + |
508 | + // Bridge height in pixels at 1x scale, for drawing bobs walking over a bridge |
509 | + uint32_t bridge_height() const; |
510 | |
511 | // A vector of all texture images that can be used for drawing a |
512 | // (normal|busy) road or a waterway. The images are guaranteed to exist. |
513 | @@ -179,6 +183,13 @@ |
514 | |
515 | uint32_t frontier_animation_id_; |
516 | uint32_t flag_animation_id_; |
517 | + uint32_t bridge_e_animation_normal_id_; |
518 | + uint32_t bridge_se_animation_normal_id_; |
519 | + uint32_t bridge_sw_animation_normal_id_; |
520 | + uint32_t bridge_e_animation_busy_id_; |
521 | + uint32_t bridge_se_animation_busy_id_; |
522 | + uint32_t bridge_sw_animation_busy_id_; |
523 | + uint32_t bridge_height_; |
524 | std::vector<std::string> normal_road_paths_; |
525 | std::vector<std::string> busy_road_paths_; |
526 | std::vector<std::string> waterway_paths_; |
527 | |
528 | === modified file 'src/logic/roadtype.h' |
529 | --- src/logic/roadtype.h 2019-06-21 06:44:40 +0000 |
530 | +++ src/logic/roadtype.h 2019-06-21 06:44:43 +0000 |
531 | @@ -29,6 +29,8 @@ |
532 | kNormal = 1, |
533 | kBusy = 2, |
534 | kWaterway = 3, |
535 | + kBridgeNormal = 4, |
536 | + kBridgeBusy = 5, |
537 | }; |
538 | |
539 | } // namespace Widelands |
540 | |
541 | === modified file 'src/wui/interactive_base.cc' |
542 | --- src/wui/interactive_base.cc 2019-06-21 06:44:40 +0000 |
543 | +++ src/wui/interactive_base.cc 2019-06-21 06:44:43 +0000 |
544 | @@ -648,6 +648,27 @@ |
545 | blit_overlay(dst, field.rendertarget_pixel.cast<int>(), image, hotspot, scale); |
546 | } |
547 | |
548 | +void InteractiveBase::draw_bridges(RenderTarget* dst, |
549 | + const FieldsToDraw::Field* f, |
550 | + uint32_t gametime, |
551 | + float scale) const { |
552 | + if (f->road_e == Widelands::RoadType::kBridgeNormal || f->road_e == Widelands::RoadType::kBridgeBusy) { |
553 | + dst->blit_animation(f->rendertarget_pixel, f->fcoords, scale, f->owner->tribe().bridge_animation( |
554 | + Widelands::WALK_E, f->road_e == Widelands::RoadType::kBridgeBusy), |
555 | + gametime, &f->owner->get_playercolor()); |
556 | + } |
557 | + if (f->road_sw == Widelands::RoadType::kBridgeNormal || f->road_sw == Widelands::RoadType::kBridgeBusy) { |
558 | + dst->blit_animation(f->rendertarget_pixel, f->fcoords, scale, f->owner->tribe().bridge_animation( |
559 | + Widelands::WALK_SW, f->road_sw == Widelands::RoadType::kBridgeBusy), |
560 | + gametime, &f->owner->get_playercolor()); |
561 | + } |
562 | + if (f->road_se == Widelands::RoadType::kBridgeNormal || f->road_se == Widelands::RoadType::kBridgeBusy) { |
563 | + dst->blit_animation(f->rendertarget_pixel, f->fcoords, scale, f->owner->tribe().bridge_animation( |
564 | + Widelands::WALK_SE, f->road_se == Widelands::RoadType::kBridgeBusy), |
565 | + gametime, &f->owner->get_playercolor()); |
566 | + } |
567 | +} |
568 | + |
569 | void InteractiveBase::mainview_move() { |
570 | if (minimap_registry_.window) { |
571 | minimap_->set_view(map_view_.view_area().rect()); |
572 | |
573 | === modified file 'src/wui/interactive_base.h' |
574 | --- src/wui/interactive_base.h 2019-06-21 06:44:40 +0000 |
575 | +++ src/wui/interactive_base.h 2019-06-21 06:44:43 +0000 |
576 | @@ -225,6 +225,8 @@ |
577 | const Vector2i& hotspot, |
578 | float scale); |
579 | |
580 | + void draw_bridges(RenderTarget* dst, const FieldsToDraw::Field* f, uint32_t gametime, float scale) const; |
581 | + |
582 | void unset_sel_picture(); |
583 | void set_sel_picture(const Image* image); |
584 | const Image* get_sel_picture() { |
585 | |
586 | === modified file 'src/wui/interactive_player.cc' |
587 | --- src/wui/interactive_player.cc 2019-06-21 06:44:40 +0000 |
588 | +++ src/wui/interactive_player.cc 2019-06-21 06:44:43 +0000 |
589 | @@ -363,6 +363,7 @@ |
590 | } |
591 | } |
592 | |
593 | + draw_bridges(dst, f, f->vision > 1 ? gametime : 0, scale); |
594 | draw_border_markers(*f, scale, *fields_to_draw, dst); |
595 | |
596 | // Render stuff that belongs to the node. |
597 | |
598 | === modified file 'src/wui/interactive_spectator.cc' |
599 | --- src/wui/interactive_spectator.cc 2019-06-21 06:44:40 +0000 |
600 | +++ src/wui/interactive_spectator.cc 2019-06-21 06:44:43 +0000 |
601 | @@ -127,6 +127,7 @@ |
602 | for (size_t idx = 0; idx < fields_to_draw->size(); ++idx) { |
603 | const FieldsToDraw::Field& field = fields_to_draw->at(idx); |
604 | |
605 | + draw_bridges(dst, &field, gametime, scale); |
606 | draw_border_markers(field, scale, *fields_to_draw, dst); |
607 | |
608 | Widelands::BaseImmovable* const imm = field.fcoords.field->get_immovable(); |
Some code review comments