Merge lp:~widelands-dev/widelands/fh1-maps-multiplayer into lp:widelands
- fh1-maps-multiplayer
- Merge into trunk
Status: | Merged | ||||||||
---|---|---|---|---|---|---|---|---|---|
Merged at revision: | 8607 | ||||||||
Proposed branch: | lp:~widelands-dev/widelands/fh1-maps-multiplayer | ||||||||
Merge into: | lp:widelands | ||||||||
Diff against target: |
248 lines (+53/-63) 6 files modified
data/maps/MP_Scenarios/Island_Hopping.wmf/scripting/first_island.lua (+4/-4) data/maps/MP_Scenarios/Island_Hopping.wmf/scripting/multiplayer_init.lua (+3/-14) data/maps/MP_Scenarios/Island_Hopping.wmf/scripting/texts.lua (+11/-14) data/maps/MP_Scenarios/Smugglers.wmf/scripting/multiplayer_init.lua (+2/-15) data/maps/MP_Scenarios/Smugglers.wmf/scripting/texts.lua (+11/-16) data/scripting/messages.lua (+22/-0) |
||||||||
To merge this branch: | bzr merge lp:~widelands-dev/widelands/fh1-maps-multiplayer | ||||||||
Related bugs: |
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Widelands Developers | Pending | ||
Review via email: mp+337506@code.launchpad.net |
Commit message
Converted MP scenarios to new font renderer.
This concludes the conversion to the new font renderer.
Thanks to Charly Ghislain (cghislai) who worked on the original branch (lp:~widelands-dev/widelands/fh1), which has now become unmergeable.
Description of the change
I have playtested Smugglers until the first smuggling report, but have done no testing on Island Hopping yet apart from loading the scenario.
bunnybot (widelandsofficial) wrote : | # |
Klaus Halfmann (klaus-halfmann) wrote : | # |
Uhmm, to test hese we must do a realo multiplayer game, no bots.
As my son has a Visitor I am not user I have time for some real testing.
Code LGTM.
GunChleoc (gunchleoc) wrote : | # |
I have tested Island Hopping now. Smugglers still needs a full test.
Klaus Halfmann (klaus-halfmann) wrote : | # |
Gun: how did you test this on your own?
I assume you need a real multiplayer setup to see all the messages?
GunChleoc (gunchleoc) wrote : | # |
I can 4 copies of Widelands on the same machine. If you start it with
./widelands &
you don't even need separate terminals.
Klaus Halfmann (klaus-halfmann) wrote : | # |
So you know the magic of cloning yourself as well ;-)
So you must play ound robn and check all the possible outcomes?
Will try this later. Now started with bug1749586
GunChleoc (gunchleoc) wrote : | # |
Yes, pretty much.
for Island Hopping, I just payed with 1 player with some soldier training until I reached the last island. Then I played the other 2 players round robin until they reached the last island too, and then I did a bit of fighting over the hill to make sure to trigger all messages.
Still need to do the same with Smugglers, but playing 2 allies and leaving the other 2 players idle should do.
GunChleoc (gunchleoc) wrote : | # |
Smugglers is impossible to test now because of https:/
I'll try to get that fixed.
GunChleoc (gunchleoc) wrote : | # |
I have managed to test Smugglers to the end now by temporarily merging lp:~widelands-dev/widelands/bug-1751440-smugglers-desync
@bunnybot merge
Preview Diff
1 | === modified file 'data/maps/MP_Scenarios/Island_Hopping.wmf/scripting/first_island.lua' | |||
2 | --- data/maps/MP_Scenarios/Island_Hopping.wmf/scripting/first_island.lua 2016-01-29 16:36:12 +0000 | |||
3 | +++ data/maps/MP_Scenarios/Island_Hopping.wmf/scripting/first_island.lua 2018-02-10 11:55:22 +0000 | |||
4 | @@ -21,10 +21,10 @@ | |||
5 | 21 | _nplayers_finished_island[island_idx] = rank | 21 | _nplayers_finished_island[island_idx] = rank |
6 | 22 | 22 | ||
7 | 23 | local rewards = _finish_rewards[island_idx][rank] | 23 | local rewards = _finish_rewards[island_idx][rank] |
12 | 24 | send_to_all(rt( | 24 | send_to_all( |
13 | 25 | p(msgs_finished_island[rank]:bformat(plr.name, island_idx + 1)) .. | 25 | msgs_finished_island[rank]:bformat(plr.name, island_idx + 1) .. |
14 | 26 | p(finished_island_continues:format(format_rewards(rewards))) | 26 | finished_island_continues:format(format_rewards(rewards)) |
15 | 27 | )) | 27 | ) |
16 | 28 | 28 | ||
17 | 29 | local new_hq = hop_to_next_island(plr, island_idx) | 29 | local new_hq = hop_to_next_island(plr, island_idx) |
18 | 30 | add_wares(new_hq, rewards) | 30 | add_wares(new_hq, rewards) |
19 | 31 | 31 | ||
20 | === modified file 'data/maps/MP_Scenarios/Island_Hopping.wmf/scripting/multiplayer_init.lua' | |||
21 | --- data/maps/MP_Scenarios/Island_Hopping.wmf/scripting/multiplayer_init.lua 2016-01-28 05:24:34 +0000 | |||
22 | +++ data/maps/MP_Scenarios/Island_Hopping.wmf/scripting/multiplayer_init.lua 2018-02-10 11:55:22 +0000 | |||
23 | @@ -2,10 +2,10 @@ | |||
24 | 2 | -- Island Hopping Fun Map Scripting | 2 | -- Island Hopping Fun Map Scripting |
25 | 3 | -- ================================= | 3 | -- ================================= |
26 | 4 | include "scripting/coroutine.lua" | 4 | include "scripting/coroutine.lua" |
27 | 5 | include "scripting/formatting.lua" | ||
28 | 6 | include "scripting/infrastructure.lua" | 5 | include "scripting/infrastructure.lua" |
29 | 7 | include "scripting/messages.lua" | 6 | include "scripting/messages.lua" |
30 | 8 | include "scripting/objective_utils.lua" | 7 | include "scripting/objective_utils.lua" |
31 | 8 | include "scripting/richtext_scenarios.lua" | ||
32 | 9 | 9 | ||
33 | 10 | -- ========== | 10 | -- ========== |
34 | 11 | -- Constants | 11 | -- Constants |
35 | @@ -92,24 +92,13 @@ | |||
36 | 92 | -- Utility functions | 92 | -- Utility functions |
37 | 93 | -- ================== | 93 | -- ================== |
38 | 94 | 94 | ||
39 | 95 | -- Sends a game status message to all players | ||
40 | 96 | function send_to_all(text, long_title) | ||
41 | 97 | for idx,plr in ipairs(game.players) do | ||
42 | 98 | if (long_title ~= nil and long_title ~= "") then | ||
43 | 99 | send_message(plr, _"Status", text, {popup=true, heading=long_title}) | ||
44 | 100 | else | ||
45 | 101 | send_message(plr, _"Status", text, {popup=true}) | ||
46 | 102 | end | ||
47 | 103 | end | ||
48 | 104 | end | ||
49 | 105 | |||
50 | 106 | -- Returns a list of rewards from _finish_rewards, formatted with getplural(count, resource) | 95 | -- Returns a list of rewards from _finish_rewards, formatted with getplural(count, resource) |
51 | 107 | function format_rewards(r) | 96 | function format_rewards(r) |
52 | 108 | rv = {} | 97 | rv = {} |
53 | 109 | for name,count in pairs(r) do | 98 | for name,count in pairs(r) do |
54 | 110 | local ware_description = wl.Game():get_ware_description(name) | 99 | local ware_description = wl.Game():get_ware_description(name) |
55 | 111 | -- TRANSLATORS: number + resource name, e.g. '1x Log' | 100 | -- TRANSLATORS: number + resource name, e.g. '1x Log' |
57 | 112 | rv[#rv + 1] = _"%1$dx %2$s":bformat(count, ware_description.descname) .. "<br>\n" | 101 | rv[#rv + 1] = li(_"%1$dx %2$s":bformat(count, ware_description.descname)) |
58 | 113 | end | 102 | end |
59 | 114 | return table.concat(rv) | 103 | return table.concat(rv) |
60 | 115 | end | 104 | end |
61 | @@ -220,7 +209,7 @@ | |||
62 | 220 | send_to_all(welcome_msg.body, welcome_msg.heading) | 209 | send_to_all(welcome_msg.body, welcome_msg.heading) |
63 | 221 | -- set the objective with the game type for all players | 210 | -- set the objective with the game type for all players |
64 | 222 | -- TODO change this to a broadcast once individual game objectives have been implemented | 211 | -- TODO change this to a broadcast once individual game objectives have been implemented |
66 | 223 | game.players[1]:add_objective("win_conditions", _"Rules", welcome_msg.body) | 212 | game.players[1]:add_objective("win_conditions", _"Rules", rt(welcome_msg.body)) |
67 | 224 | 213 | ||
68 | 225 | for idx,plr in ipairs(game.players) do | 214 | for idx,plr in ipairs(game.players) do |
69 | 226 | run(function() run_island(plr, 1) end) | 215 | run(function() run_island(plr, 1) end) |
70 | 227 | 216 | ||
71 | === modified file 'data/maps/MP_Scenarios/Island_Hopping.wmf/scripting/texts.lua' | |||
72 | --- data/maps/MP_Scenarios/Island_Hopping.wmf/scripting/texts.lua 2016-02-03 09:18:52 +0000 | |||
73 | +++ data/maps/MP_Scenarios/Island_Hopping.wmf/scripting/texts.lua 2018-02-10 11:55:22 +0000 | |||
74 | @@ -3,7 +3,7 @@ | |||
75 | 3 | -- ======================================================================= | 3 | -- ======================================================================= |
76 | 4 | welcome_msg = { | 4 | welcome_msg = { |
77 | 5 | heading = _"Welcome to Island Hopping", | 5 | heading = _"Welcome to Island Hopping", |
79 | 6 | body = rt( | 6 | body = |
80 | 7 | h2(_"Rules") .. | 7 | h2(_"Rules") .. |
81 | 8 | p(_( | 8 | p(_( |
82 | 9 | [[Island Hopping is a traditional tournament in Atlantean culture. ]] .. | 9 | [[Island Hopping is a traditional tournament in Atlantean culture. ]] .. |
83 | @@ -37,22 +37,19 @@ | |||
84 | 37 | h4(_"2nd to finish") .. p(format_rewards(_finish_rewards[2][2])) .. | 37 | h4(_"2nd to finish") .. p(format_rewards(_finish_rewards[2][2])) .. |
85 | 38 | h4(_"3rd to finish") .. p(format_rewards(_finish_rewards[2][3])) .. | 38 | h4(_"3rd to finish") .. p(format_rewards(_finish_rewards[2][3])) .. |
86 | 39 | h4(_"4th to finish") .. p(format_rewards(_finish_rewards[2][4])) | 39 | h4(_"4th to finish") .. p(format_rewards(_finish_rewards[2][4])) |
87 | 40 | ) | ||
88 | 41 | } | 40 | } |
89 | 42 | 41 | ||
90 | 43 | msgs_finished_island = { | 42 | msgs_finished_island = { |
95 | 44 | _"%1$s was the first to reach Island number %2$i.", | 43 | li(_"%1$s was the first to reach Island number %2$i."), |
96 | 45 | _"%1$s was the second to reach Island number %2$i.", | 44 | li(_"%1$s was the second to reach Island number %2$i."), |
97 | 46 | _"%1$s was the third to reach Island number %2$i.", | 45 | li(_"%1$s was the third to reach Island number %2$i."), |
98 | 47 | _"%1$s was the fourth to reach Island number %2$i." | 46 | li(_"%1$s was the fourth to reach Island number %2$i.") |
99 | 48 | } | 47 | } |
101 | 49 | finished_island_continues = _ "The reward for this feat amounts to:" .. "<br>%s" | 48 | finished_island_continues = p(_"The reward for this feat amounts to:") .. p("%s") |
102 | 50 | 49 | ||
104 | 51 | player_claims_hill = rt(p(_ | 50 | player_claims_hill = p(_ |
105 | 52 | [[%s is now King of the Hill and will win the game in 20 minutes, if nobody takes over the hill before then.]] | 51 | [[%s is now King of the Hill and will win the game in 20 minutes, if nobody takes over the hill before then.]] |
112 | 53 | )) | 52 | ) |
113 | 54 | lost_control = rt(p(_ | 53 | lost_control = p(_[[%s lost control of the hill.]]) |
114 | 55 | [[%s lost control of the hill.]] | 54 | had_control_for = p(_[[%1$s has been King of the Hill for %2$s!]]) |
115 | 56 | )) | 55 | player_won = p(_[[%s has won the game. Congratulations!]]) |
110 | 57 | had_control_for = rt(p(_[[%1$s has been King of the Hill for %2$s!]])) | ||
111 | 58 | player_won = rt(p(_[[%s has won the game. Congratulations!]])) | ||
116 | 59 | 56 | ||
117 | === modified file 'data/maps/MP_Scenarios/Smugglers.wmf/scripting/multiplayer_init.lua' | |||
118 | --- data/maps/MP_Scenarios/Smugglers.wmf/scripting/multiplayer_init.lua 2016-01-28 05:24:34 +0000 | |||
119 | +++ data/maps/MP_Scenarios/Smugglers.wmf/scripting/multiplayer_init.lua 2018-02-10 11:55:22 +0000 | |||
120 | @@ -3,8 +3,8 @@ | |||
121 | 3 | -- ================================= | 3 | -- ================================= |
122 | 4 | include "scripting/coroutine.lua" | 4 | include "scripting/coroutine.lua" |
123 | 5 | include "scripting/infrastructure.lua" | 5 | include "scripting/infrastructure.lua" |
124 | 6 | include "scripting/formatting.lua" | ||
125 | 7 | include "scripting/objective_utils.lua" | 6 | include "scripting/objective_utils.lua" |
126 | 7 | include "scripting/richtext_scenarios.lua" | ||
127 | 8 | include "scripting/set.lua" | 8 | include "scripting/set.lua" |
128 | 9 | 9 | ||
129 | 10 | -- ========== | 10 | -- ========== |
130 | @@ -35,19 +35,6 @@ | |||
131 | 35 | -- ================= | 35 | -- ================= |
132 | 36 | points = { 0, 0 } | 36 | points = { 0, 0 } |
133 | 37 | 37 | ||
134 | 38 | -- ================= | ||
135 | 39 | -- Utility functions | ||
136 | 40 | -- ================= | ||
137 | 41 | function send_to_all(text, long_title) | ||
138 | 42 | for idx,plr in ipairs(game.players) do | ||
139 | 43 | if (long_title ~= nil and long_title ~= "") then | ||
140 | 44 | send_message(plr, _"Status", text, {popup=true, heading=long_title}) | ||
141 | 45 | else | ||
142 | 46 | send_message(plr, _"Status", text, {popup=true}) | ||
143 | 47 | end | ||
144 | 48 | end | ||
145 | 49 | end | ||
146 | 50 | |||
147 | 51 | include "map:scripting/texts.lua" | 38 | include "map:scripting/texts.lua" |
148 | 52 | include "map:scripting/smuggling.lua" | 39 | include "map:scripting/smuggling.lua" |
149 | 53 | 40 | ||
150 | @@ -145,7 +132,7 @@ | |||
151 | 145 | send_to_all(welcome_msg.body:format((ngettext("%i point", "%i points", points_to_win)):format(points_to_win)), welcome_msg.heading) | 132 | send_to_all(welcome_msg.body:format((ngettext("%i point", "%i points", points_to_win)):format(points_to_win)), welcome_msg.heading) |
152 | 146 | -- set the objective with the game type for all players | 133 | -- set the objective with the game type for all players |
153 | 147 | -- TODO change this to a broadcast once individual game objectives have been implementes | 134 | -- TODO change this to a broadcast once individual game objectives have been implementes |
155 | 148 | game.players[1]:add_objective("win_conditions", _"Rules", welcome_msg.body:format((ngettext("%i point", "%i points", points_to_win)):format(points_to_win))) | 135 | game.players[1]:add_objective("win_conditions", _"Rules", rt(welcome_msg.body:format((ngettext("%i point", "%i points", points_to_win)):format(points_to_win)))) |
156 | 149 | 136 | ||
157 | 150 | for idx,descr in ipairs(route_descrs) do | 137 | for idx,descr in ipairs(route_descrs) do |
158 | 151 | run(wait_for_established_route, descr) | 138 | run(wait_for_established_route, descr) |
159 | 152 | 139 | ||
160 | === modified file 'data/maps/MP_Scenarios/Smugglers.wmf/scripting/texts.lua' | |||
161 | --- data/maps/MP_Scenarios/Smugglers.wmf/scripting/texts.lua 2015-12-03 09:56:01 +0000 | |||
162 | +++ data/maps/MP_Scenarios/Smugglers.wmf/scripting/texts.lua 2018-02-10 11:55:22 +0000 | |||
163 | @@ -4,41 +4,36 @@ | |||
164 | 4 | 4 | ||
165 | 5 | welcome_msg = { | 5 | welcome_msg = { |
166 | 6 | heading = _"Smugglers", | 6 | heading = _"Smugglers", |
168 | 7 | body = rt( | 7 | body = |
169 | 8 | h2(_"Rules") .. | 8 | h2(_"Rules") .. |
170 | 9 | p(_([[Smugglers is a fun map for 4 players. You and your partner start diagonally from each other on a point symmetric island. There are plenty of smuggling tunnels on this island, each consisting of a receiving and a sending end.]])) .. | 9 | p(_([[Smugglers is a fun map for 4 players. You and your partner start diagonally from each other on a point symmetric island. There are plenty of smuggling tunnels on this island, each consisting of a receiving and a sending end.]])) .. |
171 | 10 | p(_([[To establish a smuggling route, you need to build a warehouse on a sending/receiving spot while your team mate has to build one on the corresponding receiving/sending spot. A ware is then transported every 10 seconds.]])) .. | 10 | p(_([[To establish a smuggling route, you need to build a warehouse on a sending/receiving spot while your team mate has to build one on the corresponding receiving/sending spot. A ware is then transported every 10 seconds.]])) .. |
172 | 11 | -- TRANSLATORS: %s = '<number> points' | 11 | -- TRANSLATORS: %s = '<number> points' |
173 | 12 | p(_([[For harder to defend smuggling routes, you get 2 or 3 points per ware smuggled. The first team to collect %s wins.]])) .. | 12 | p(_([[For harder to defend smuggling routes, you get 2 or 3 points per ware smuggled. The first team to collect %s wins.]])) .. |
179 | 13 | rt(h2(_"A sending spot")) .. rt("image=map:send_spot.png", p(" ")) .. | 13 | h2(_"A sending spot") .. p(img("map:send_spot.png")) .. |
180 | 14 | rt(h2(_"A receiving spot")) .. rt("image=map:recv_spot.png", p(" ")) .. | 14 | h2(_"A receiving spot") .. p(img("map:recv_spot.png")) .. |
181 | 15 | rt(h2(_"Notes") .. | 15 | h2(_"Notes") .. |
182 | 16 | p(_([[Remember that the map has rotational symmetry. For example, when you have found a spot to the top-left of your headquarters, the corresponding spot will be to the bottom-right of the headquarters of your team mate.]]))) .. | 16 | p(_([[Remember that the map has rotational symmetry. For example, when you have found a spot to the top-left of your headquarters, the corresponding spot will be to the bottom-right of the headquarters of your team mate.]])) .. |
183 | 17 | p(_([[You can see the number of wares traded at any time in the general statistics menu. Good luck!]]))) | 17 | p(_([[You can see the number of wares traded at any time in the general statistics menu. Good luck!]])) |
184 | 18 | } | 18 | } |
185 | 19 | 19 | ||
187 | 20 | smuggling_route_established_other_team = rt( | 20 | smuggling_route_established_other_team = |
188 | 21 | -- TRANSLATORS: the first 2 parameters are player names, the last parameter is '<number> points' | 21 | -- TRANSLATORS: the first 2 parameters are player names, the last parameter is '<number> points' |
189 | 22 | p(_([[A new smuggling route from %1$s to %2$s has been established! Every ware they smuggle there is worth %3$s.]])) | 22 | p(_([[A new smuggling route from %1$s to %2$s has been established! Every ware they smuggle there is worth %3$s.]])) |
190 | 23 | ) | ||
191 | 24 | 23 | ||
193 | 25 | smuggling_route_established_sender = rt( | 24 | smuggling_route_established_sender = |
194 | 26 | -- TRANSLATORS: %s = '<number> points' | 25 | -- TRANSLATORS: %s = '<number> points' |
195 | 27 | p(_([[Your team has established a new smuggling route. You have the sending warehouse. Every ware smuggled here is worth %s.]])) | 26 | p(_([[Your team has established a new smuggling route. You have the sending warehouse. Every ware smuggled here is worth %s.]])) |
196 | 28 | ) | ||
197 | 29 | 27 | ||
199 | 30 | smuggling_route_established_receiver = rt( | 28 | smuggling_route_established_receiver = |
200 | 31 | -- TRANSLATORS: %s = '<number> points' | 29 | -- TRANSLATORS: %s = '<number> points' |
201 | 32 | p(_([[Your team has established a new smuggling route. You have the receiving warehouse. Every ware smuggled here is worth %s.]])) | 30 | p(_([[Your team has established a new smuggling route. You have the receiving warehouse. Every ware smuggled here is worth %s.]])) |
202 | 33 | ) | ||
203 | 34 | 31 | ||
205 | 35 | smuggling_route_broken = rt( | 32 | smuggling_route_broken = |
206 | 36 | -- TRANSLATORS: the first parameter is '<number> points', the last 2 parameters are player names | 33 | -- TRANSLATORS: the first parameter is '<number> points', the last 2 parameters are player names |
207 | 37 | p(_[[The smuggling route worth %1$s from %2$s to %3$s has been broken!]]) | 34 | p(_[[The smuggling route worth %1$s from %2$s to %3$s has been broken!]]) |
208 | 38 | ) | ||
209 | 39 | 35 | ||
211 | 40 | game_over = rt( | 36 | game_over = |
212 | 41 | h1(_"Game over!") .. | 37 | h1(_"Game over!") .. |
213 | 42 | -- TRANSLATORS: the first 4 parameters are player names, the last parameter is '<number> points' | 38 | -- TRANSLATORS: the first 4 parameters are player names, the last parameter is '<number> points' |
214 | 43 | p(_[[Game over! %1$s and %2$s have won the game! %3$s and %4$s only managed to collect %5$s.]]) | 39 | p(_[[Game over! %1$s and %2$s have won the game! %3$s and %4$s only managed to collect %5$s.]]) |
215 | 44 | ) | ||
216 | 45 | 40 | ||
217 | === modified file 'data/scripting/messages.lua' | |||
218 | --- data/scripting/messages.lua 2017-12-09 06:29:26 +0000 | |||
219 | +++ data/scripting/messages.lua 2018-02-10 11:55:22 +0000 | |||
220 | @@ -33,6 +33,28 @@ | |||
221 | 33 | player:send_message(title, body, parameters) | 33 | player:send_message(title, body, parameters) |
222 | 34 | end | 34 | end |
223 | 35 | 35 | ||
224 | 36 | |||
225 | 37 | -- RST | ||
226 | 38 | -- .. function:: send_to_all(text[, heading]) | ||
227 | 39 | -- | ||
228 | 40 | -- Sends a game status message to all players. | ||
229 | 41 | -- | ||
230 | 42 | -- :arg text: the localized body of the message. You can use rt functions here. | ||
231 | 43 | -- :type text: :class:`string` | ||
232 | 44 | -- :arg heading: the localized title of the message (optional) | ||
233 | 45 | -- :type heading: :class:`string` | ||
234 | 46 | -- | ||
235 | 47 | function send_to_all(text, heading) | ||
236 | 48 | for idx,plr in ipairs(game.players) do | ||
237 | 49 | if (heading ~= nil and heading ~= "") then | ||
238 | 50 | send_message(plr, _"Status", text, {popup=true, heading=heading}) | ||
239 | 51 | else | ||
240 | 52 | send_message(plr, _"Status", text, {popup=true}) | ||
241 | 53 | end | ||
242 | 54 | end | ||
243 | 55 | end | ||
244 | 56 | |||
245 | 57 | |||
246 | 36 | -- RST | 58 | -- RST |
247 | 37 | -- .. function:: message_box(player, title, message, parameters) | 59 | -- .. function:: message_box(player, title, message, parameters) |
248 | 38 | -- | 60 | -- |
Continuous integration builds have changed state:
Travis build 3160. State: passed. Details: https:/ /travis- ci.org/ widelands/ widelands/ builds/ 339824814. /ci.appveyor. com/project/ widelands- dev/widelands/ build/_ widelands_ dev_widelands_ fh1_maps_ multiplayer- 2967.
Appveyor build 2967. State: success. Details: https:/