Merge lp:~widelands-dev/widelands/fh1-scenario-groundwork-emp1 into lp:widelands

Proposed by GunChleoc
Status: Merged
Merged at revision: 8552
Proposed branch: lp:~widelands-dev/widelands/fh1-scenario-groundwork-emp1
Merge into: lp:widelands
Diff against target: 498 lines (+158/-58)
8 files modified
data/campaigns/emp01.wmf/scripting/texts.lua (+7/-8)
data/scripting/format_scenario.lua (+85/-0)
data/scripting/messages.lua (+5/-4)
data/scripting/richtext.lua (+17/-15)
data/scripting/richtext_scenarios.lua (+31/-30)
src/graphic/text/rt_parse.cc (+1/-0)
src/graphic/text/rt_render.cc (+1/-0)
src/wui/game_objectives_menu.cc (+11/-1)
To merge this branch: bzr merge lp:~widelands-dev/widelands/fh1-scenario-groundwork-emp1
Reviewer Review Type Date Requested Status
kaputtnik (community) Needs Fixing
Review via email: mp+335294@code.launchpad.net

Commit message

Started converting scenarios to new font renderer

- Story Message Box and Objectives now try to use the new font renderer before falling back to the old one.
- Added version of scenario formatting for the new renderer.
- Converted Empire Scenario 1 to new font renderer
- Atlantean campaign now uses the campaign_message_box function.

Description of the change

Finished the needed C++ programming for converting the scenarios to the new font renderer. Using Tutorial 1 and Empire 1 as test cases.

When testing, all story messages and objectives need to be looked at, to make sure that there's no broken markup.

https://code.launchpad.net/~widelands-dev/widelands/fh1-editorhelp should be reviewed first - those changes were merged into this branch to make it work.

To post a comment you must log in.
Revision history for this message
bunnybot (widelandsofficial) wrote :

Continuous integration builds have changed state:

Travis build 2974. State: failed. Details: https://travis-ci.org/widelands/widelands/builds/317654212.
Appveyor build 2783. State: success. Details: https://ci.appveyor.com/project/widelands-dev/widelands/build/_widelands_dev_widelands_fh1_scenario_groundwork_emp1-2783.

Revision history for this message
kaputtnik (franku) wrote :

I guessed the issue i found also in current trunk will be fixed when converting to the new font renderer, but when opening the first tutorial with this branch i get the same messages in terminal for each message box:

Story Message Box: falling back to OLD font renderer:
[..]
Syntax error at 1:20: expected an allowed attribute, got 'font-size'. String continues with: '=18 font-weight=bold font-color=D1D1D1>Welcome to Widelands!<br></p><p font-size=8> <br></p><p line-'

or:

Syntax error at 1:23: expected an allowed attribute, got 'line-spacing'. String continues with: '=3 font-size=12>First, I’ll left-click on the symbol where I want the lumberjack’s hut to be bui'

There is also one with 'image'

Is this a new bug?

Revision history for this message
GunChleoc (gunchleoc) wrote :

Actually, that should not happen with the first tutorial - looks like I missed something while converting the scenario.

For all other scenarios, that message is expected.

Revision history for this message
GunChleoc (gunchleoc) wrote :

Seems like my changes for Tutorial1 didn't land in the branch, so they're lost now. Will have to redo those in another branch.

Is the empire scenario clean?

Revision history for this message
kaputtnik (franku) wrote :

The text in the first message does not use the available width below the image. The text appears all on the right side. In trunk the text uses the whole width of the message box below the image if the text block is taller than the height of the image.

All other looks good, imho.

Sorry for posting in the wrong merge request :-S

Revision history for this message
kaputtnik (franku) wrote :

Some nitpicking in the comments

Revision history for this message
GunChleoc (gunchleoc) wrote :

Thanks for the review :)

Needs a quick retest before merging.

Revision history for this message
kaputtnik (franku) wrote :

Looks like there was a merge conflict wich is not solved in scenario/richtext.lua. See line number 350 in the div below.

The scenario does not even load:

Trying to run: map:scripting/init.lua: Fatal exception: lua: [/home/kaputtnik/Quellcode/widelands-repo/fh1-scenario-groundwork-emp1/src/scripting/lua_errors.cc:22] [/home/kaputtnik/Quellcode/widelands-repo/fh1-scenario-groundwork-emp1/src/scripting/lua_errors.cc:22] [/home/kaputtnik/Quellcode/widelands-repo/fh1-scenario-groundwork-emp1/src/scripting/lua_errors.cc:22] [/home/kaputtnik/Quellcode/widelands-repo/fh1-scenario-groundwork-emp1/src/scripting/lua_errors.cc:22] [string "scripting/richtext.lua"]:311: 'end' expected (to close 'function' at line 309) near '
FATAL ERROR - game crashed. Attempting emergency save.

review: Needs Fixing
Revision history for this message
GunChleoc (gunchleoc) wrote :

Hopefully fixed now.

Revision history for this message
kaputtnik (franku) wrote :

No, see diff comment.

review: Needs Fixing
Revision history for this message
bunnybot (widelandsofficial) wrote :

Continuous integration builds have changed state:

Travis build 3027. State: errored. Details: https://travis-ci.org/widelands/widelands/builds/325436141.
Appveyor build 2835. State: success. Details: https://ci.appveyor.com/project/widelands-dev/widelands/build/_widelands_dev_widelands_fh1_scenario_groundwork_emp1-2835.

Revision history for this message
GunChleoc (gunchleoc) wrote :

Good thing Travis errored - I hate not being able to compile. Should be fixed now.

Revision history for this message
GunChleoc (gunchleoc) wrote :

@bunnybot merge

Revision history for this message
kaputtnik (franku) wrote :

The text of the first message does not yet slip below the image which i have tried to explain in https://code.launchpad.net/~widelands-dev/widelands/fh1-scenario-groundwork-emp1/+merge/335294/comments/878675. I thought that has been fixed?

Revision history for this message
bunnybot (widelandsofficial) wrote :

Continuous integration builds have changed state:

Travis build 3033. State: failed. Details: https://travis-ci.org/widelands/widelands/builds/325760854.
Appveyor build 2841. State: success. Details: https://ci.appveyor.com/project/widelands-dev/widelands/build/_widelands_dev_widelands_fh1_scenario_groundwork_emp1-2841.

Revision history for this message
bunnybot (widelandsofficial) wrote :

Refusing to merge, since Travis is not green. Use @bunnybot merge force for merging anyways.

Travis build 3033. State: failed. Details: https://travis-ci.org/widelands/widelands/builds/325760854.

Revision history for this message
GunChleoc (gunchleoc) wrote :

No, it hasn't, since that's already known - it will take come non-trivial coding to add the feature to the new font renderer too. There is some stuff the new renderer can do that the old one can't - e.g. proper bullet-point lists - and vice versa.

I still think that converting everything now is important though, since our Korean translator can see only blank squares.

Is everything else OK in this branch now?

Revision history for this message
kaputtnik (franku) wrote :

It's not a show stopper, and everything else looks good, so get this in now :-)

@bunnybot merge force

Revision history for this message
GunChleoc (gunchleoc) wrote :

Thanks for the review :)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'data/campaigns/emp01.wmf/scripting/texts.lua'
2--- data/campaigns/emp01.wmf/scripting/texts.lua 2016-05-17 16:40:22 +0000
3+++ data/campaigns/emp01.wmf/scripting/texts.lua 2018-01-06 11:27:52 +0000
4@@ -2,8 +2,7 @@
5 -- Some formating functions
6 -- =========================
7
8-include "scripting/formatting.lua"
9-include "scripting/format_scenario.lua"
10+include "scripting/richtext_scenarios.lua"
11
12 function lutius(title, text)
13 return speech("map:Lutius.png", "2F9131", title, text)
14@@ -28,7 +27,7 @@
15 title=_"Build a blockhouse",
16 number = 1,
17 body = objective_text(_"Blockhouse",
18- listitem_bullet(_[[Build a blockhouse at the red house symbol on the east side of the forests, to the right of your provisional headquarters.]])
19+ li(_[[Build a blockhouse at the red house symbol on the east side of the forests, to the right of your provisional headquarters.]])
20 ),
21 }
22
23@@ -37,7 +36,7 @@
24 title=_"Build a lumberjack’s house",
25 number = 1,
26 body = objective_text(_"Lumberjack’s House",
27- listitem_bullet(_[[Build a lumberjack’s house at the red house symbol, south of your provisional headquarters.]])
28+ li(_[[Build a lumberjack’s house at the red house symbol, south of your provisional headquarters.]])
29 ),
30 }
31
32@@ -46,7 +45,7 @@
33 title=_"Build 2 lumberjack’s houses and a sawmill",
34 number = 3,
35 body = objective_text(_"Two Lumberjack’s Houses and a Sawmill",
36- listitem_bullet(_[[Build two more lumberjack’s houses and a sawmill as soon as there is enough space for them.]])
37+ li(_[[Build two more lumberjack’s houses and a sawmill as soon as there is enough space for them.]])
38 ),
39 }
40
41@@ -55,7 +54,7 @@
42 title=_"Build a forester’s house",
43 number = 1,
44 body = objective_text(_"Forester’s House",
45- listitem_bullet(_[[Build a forester’s house to preserve the wood resources of this island.]])
46+ li(_[[Build a forester’s house to preserve the wood resources of this island.]])
47 ),
48 }
49
50@@ -64,8 +63,8 @@
51 title=_"Build a quarry",
52 number = 5,
53 body = objective_text(_"Quarry",
54- listitem_bullet(_[[Build a quarry in the south to cut some granite and marble out of the rocks.]]) ..
55- listitem_arrow(_[[These might be used for future buildings.]])
56+ li(_[[Build a quarry in the south to cut some granite and marble out of the rocks.]]) ..
57+ li_arrow(_[[These might be used for future buildings.]])
58 ),
59 }
60
61
62=== added file 'data/scripting/format_scenario.lua'
63--- data/scripting/format_scenario.lua 1970-01-01 00:00:00 +0000
64+++ data/scripting/format_scenario.lua 2018-01-06 11:27:52 +0000
65@@ -0,0 +1,85 @@
66+-- RST
67+-- format_scenario.lua
68+-- -------------------
69+--
70+-- Function to simplify and unique text formatting in scenarios. Most of these
71+-- functions are simple wrapper functions that make working with widelands rich
72+-- text formatting system more bearable.
73+
74+
75+-- RST
76+-- .. function:: speech(img, clr, title, text)
77+--
78+-- Formats a text as spoken by one person in a scenario. Use it as follows:
79+--
80+-- .. code-block:: lua
81+--
82+-- function jundlina(title, text)
83+-- return speech("map:princess.png", "2F9131", title, text)
84+-- end
85+--
86+-- :arg img: name of the image to use for this speaker
87+-- :arg clr: a valid 6 char hex color to use for the name of this speaker
88+-- :arg title: Title of this text.
89+-- :arg text: The text itself. If this is nil, :const:`title` is used as text
90+-- instead and there will not be any title.
91+-- :returns: the formatted text.
92+
93+function speech(img, clr, g_title, g_text)
94+ local title, text = g_title, g_text
95+ if not text then
96+ title = nil
97+ text = g_title
98+ end
99+
100+ -- Surround the text with translatable ","
101+ text = (_'“%s”'):format(text)
102+
103+ local s = ""
104+ if title then
105+ s = rt("<p font-size=20 font-weight=bold font-face=serif " ..
106+ ("font-color=%s>"):format(clr) .. title ..
107+ "</p><p font-size=8> <br></p>"
108+ )
109+ end
110+
111+ return s .. rt(("image=%s"):format(img), p(text))
112+end
113+
114+
115+-- RST
116+-- .. function:: objective_text(heading, body)
117+--
118+-- Provides nice formatting for objective texts.
119+--
120+-- :returns: a rich text object that contains the formatted
121+-- objective text.
122+--
123+function objective_text(heading, body)
124+ return rt(h2(heading) .. p(body))
125+end
126+
127+
128+-- RST
129+-- Append an objective text with a header to a dialog box in a nice fashion.
130+-- For displaying objectives with an extra title when an advisor is talking
131+--
132+-- Provides nice formatting for objective texts.
133+-- the following arguments will be parsed:
134+-- number: the number of objectives described in the body
135+-- body: the objective text, e.g. created with function objective_text(heading, body)
136+--
137+-- :returns: a rich text object that contains the formatted
138+-- objective text & title.
139+--
140+function new_objectives(...)
141+ local sum = 0
142+ local s = ""
143+ for idx,obj in ipairs{...} do
144+ s = s .. obj.body
145+ sum = sum + obj.number
146+ end
147+ return rt("<p font-size=10> <br></p>" ..
148+ "<p font=serif font-size=18 font-weight=bold font-color=D1D1D1>"
149+ .. ngettext("New Objective", "New Objectives", sum) .. "</p>") .. s
150+end
151
152=== modified file 'data/scripting/messages.lua'
153--- data/scripting/messages.lua 2017-05-12 09:43:57 +0000
154+++ data/scripting/messages.lua 2018-01-06 11:27:52 +0000
155@@ -5,6 +5,7 @@
156 -- Functions to send messages to the player and to add objectives to campaigns.
157
158 include "scripting/coroutine.lua"
159+include "scripting/richtext.lua"
160 include "scripting/table.lua"
161 include "scripting/ui.lua"
162
163@@ -51,7 +52,7 @@
164 -- While the message box is shown, the user cannot do anything else anyway.
165 local user_input = wl.ui.get_user_input_allowed()
166 wl.ui.set_user_input_allowed(true)
167- player:message_box(title, body, parameters)
168+ player:message_box(title, rt(body), parameters)
169 wl.ui.set_user_input_allowed(user_input)
170 end
171
172@@ -83,9 +84,9 @@
173 --
174 function add_campaign_objective(objective)
175 if objective.obj_name then
176- return wl.Game().players[1]:add_objective(objective.obj_name, objective.obj_title, objective.obj_body)
177+ return wl.Game().players[1]:add_objective(objective.obj_name, objective.obj_title, rt(objective.obj_body))
178 else
179- return wl.Game().players[1]:add_objective(objective.name, objective.title, objective.body)
180+ return wl.Game().players[1]:add_objective(objective.name, objective.title, rt(objective.body))
181 end
182 end
183
184@@ -160,7 +161,7 @@
185 -- message_box takes care of this, but player:message_box does not
186 local user_input = wl.ui.get_user_input_allowed()
187 wl.ui.set_user_input_allowed(true)
188- player:message_box(message.title, message.body, message)
189+ player:message_box(message.title, rt(message.body), message)
190 wl.ui.set_user_input_allowed(user_input)
191 else
192 message_box(plr, message.title, message.body, message)
193
194=== modified file 'data/scripting/richtext.lua'
195--- data/scripting/richtext.lua 2018-01-04 14:29:21 +0000
196+++ data/scripting/richtext.lua 2018-01-06 11:27:52 +0000
197@@ -73,7 +73,7 @@
198 -- :arg text: the text to be enclosed in rich text tags.
199 -- :type text: :class:`string`
200 -- :returns: the wrapped rich text.
201---
202+
203 function rt(text_or_attributes, text)
204 if text then
205 return "<rt " .. text_or_attributes .. ">" .. text .. "</rt>"
206@@ -99,7 +99,7 @@
207 -- ref: TODO(GunChleoc): I have no idea what it does.
208 --
209 -- :returns: the img tag.
210---
211+
212 function img(src, attributes)
213 if attributes then
214 return "<img src=" .. src .." " .. attributes .. ">"
215@@ -148,7 +148,7 @@
216 -- Like :func:`h2` but smaller.
217 --
218 -- :returns: A paragraph with text formatted as heading.
219---
220+
221 function h3(text)
222 return p_font("", "size=13 color=D1D1D1", vspace(6) .. text .. vspace(1))
223 end
224@@ -160,7 +160,7 @@
225 -- Like :func:`h3` but smaller.
226 --
227 -- :returns: A paragraph with text formatted as heading.
228---
229+
230 function h4(text)
231 return p_font("", "size=12 italic=1 color=D1D1D1", text)
232 end
233@@ -233,7 +233,7 @@
234 --
235 -- :returns: The closing tags for a paragraph
236 function close_p(t)
237- return vspace(6) .. "</font></p>"
238+ return vspace(6) .. "</font>" .. vspace(6) .. "</p>"
239 end
240
241 -- RST
242@@ -252,7 +252,7 @@
243 -- ref: TODO(GunChleoc): I don't know what this does.
244 --
245 -- :returns: The text wrapped in font tags with the given attributes
246---
247+
248 function font(attributes, text)
249 return ("<font %s>"):format(attributes) .. text .. "</font>"
250 end
251@@ -264,7 +264,7 @@
252 -- :arg gap: the size of the space as pixels.
253 --
254 -- :returns: a space tag
255---
256+
257 function space(gap)
258 return "<space gap="..gap..">"
259 end
260@@ -276,7 +276,7 @@
261 -- :arg gap: the size of the space as pixels.
262 --
263 -- :returns: a vspace tag
264---
265+
266 function vspace(gap)
267 return "<vspace gap="..gap..">"
268 end
269@@ -290,7 +290,7 @@
270 -- :arg dd: "description data", will be rendered normally.
271 --
272 -- :returns: a p tag containing the formatted text
273---
274+
275 function dl(dt, dd)
276 return p(b(dt) .. " " .. dd)
277 end
278@@ -305,6 +305,7 @@
279 -- :arg text: the text of the list item
280 --
281 -- :returns: a p tag containing the formatted text
282+
283 function li(text_or_symbol, text)
284 if text then
285 return div(p(text_or_symbol)) .. div(p(space(6))) .. div("width=*", p(text .. vspace(6)))
286@@ -336,6 +337,7 @@
287 -- :arg text: the text to be placed next to the image
288 --
289 -- :returns: the text wrapped in a paragraph and placed next to the image, the outer tag is a div.
290+
291 function li_image(imagepath, text)
292 return
293 div("width=100%",
294@@ -353,7 +355,7 @@
295 -- :arg link: the text to format
296 --
297 -- :returns: a font tag containing the underlined text
298---
299+
300 function a(link)
301 return font("underline=1", link)
302 end
303@@ -366,7 +368,7 @@
304 -- :arg link: the text to format
305 --
306 -- :returns: a font tag containing the bold text
307---
308+
309 function b(text)
310 return font("bold=1", text)
311 end
312@@ -379,7 +381,7 @@
313 -- :arg link: the text to format
314 --
315 -- :returns: a font tag containing the italic text
316---
317+
318 function i(text)
319 return font("italic=1", text)
320 end
321@@ -391,7 +393,7 @@
322 -- :arg link: the text to format
323 --
324 -- :returns: a font tag containing the underlined text
325---
326+
327 function u(text)
328 return font("underline=1", text)
329 end
330@@ -416,7 +418,7 @@
331 -- :arg text: the text to be enclosed in div tags.
332 -- :type text: :class:`string`
333 -- :returns: the text wrapped in a div tag.
334---
335+
336 function div(text_or_attributes, text)
337 if text then
338 return ("<div %s>"):format(text_or_attributes) .. text .. "</div>"
339@@ -433,7 +435,7 @@
340 -- :arg t1: text in h3 format.
341 -- :arg t2: text in p format.
342 -- :returns: header text followed by normal text.
343---
344+
345 function inline_header(header, text)
346 return
347 div("width=100%", vspace(8)) ..
348
349=== renamed file 'data/scripting/format_scenario.lua' => 'data/scripting/richtext_scenarios.lua'
350--- data/scripting/format_scenario.lua 2016-10-19 09:00:29 +0000
351+++ data/scripting/richtext_scenarios.lua 2018-01-06 11:27:52 +0000
352@@ -1,12 +1,13 @@
353+include "scripting/richtext.lua"
354+
355 -- RST
356--- format_scenario.lua
357--- -------------------
358+-- richtext_scenarios.lua
359+-- ----------------------
360 --
361 -- Function to simplify and unique text formatting in scenarios. Most of these
362 -- functions are simple wrapper functions that make working with widelands rich
363 -- text formatting system more bearable.
364
365-
366 -- RST
367 -- .. function:: speech(img, clr, title, text)
368 --
369@@ -20,31 +21,33 @@
370 --
371 -- :arg img: name of the image to use for this speaker
372 -- :arg clr: a valid 6 char hex color to use for the name of this speaker
373--- :arg title: Title of this text.
374--- :arg text: The text itself. If this is nil, :const:`title` is used as text
375--- instead and there will not be any title.
376+-- :arg title: Title of this text. Use empty string if you don't want any.
377+-- :arg text: The text itself.
378 -- :returns: the formatted text.
379---
380-function speech(img, clr, g_title, g_text)
381- local title, text = g_title, g_text
382- if not text then
383- title = nil
384- text = g_title
385+
386+function speech(img, clr, title, text)
387+ if title ~= "" then
388+ title = h1(clr, title)
389 end
390
391 -- Surround the text with translatable ","
392 text = (_'“%s”'):format(text)
393
394- local s = ""
395- if title then
396- s = rt("<p font-size=20 font-weight=bold font-face=serif " ..
397- ("font-color=%s>"):format(clr) .. title ..
398- "</p><p font-size=8> <br></p>"
399- )
400- end
401-
402- return s .. rt(("image=%s"):format(img), p(text))
403-end
404+ return title .. li_image(img, p(text))
405+end
406+
407+-- RST
408+-- .. function:: paragraphdivider()
409+--
410+-- Closes a paragraph and opens a new paragraph. Use this when you format a string with the speech function
411+-- and need to divide the speech into multiple paragraphs.
412+--
413+-- :returns: close_p() .. open_p()
414+
415+function paragraphdivider()
416+ return close_p() .. open_p()
417+end
418+
419
420
421 -- RST
422@@ -54,9 +57,9 @@
423 --
424 -- :returns: a rich text object that contains the formatted
425 -- objective text.
426---
427+
428 function objective_text(heading, body)
429- return rt(h2(heading) .. p(body))
430+ return h2(heading) .. p(body)
431 end
432
433
434@@ -71,15 +74,13 @@
435 --
436 -- :returns: a rich text object that contains the formatted
437 -- objective text & title.
438---
439+
440 function new_objectives(...)
441 local sum = 0
442- local s = ""
443+ local text = ""
444 for idx,obj in ipairs{...} do
445- s = s .. obj.body
446+ text = text .. obj.body
447 sum = sum + obj.number
448 end
449- return rt("<p font-size=10> <br></p>" ..
450- "<p font=serif font-size=18 font-weight=bold font-color=D1D1D1>"
451- .. ngettext("New Objective", "New Objectives", sum) .. "</p>") .. s
452+ return h1(ngettext("New Objective", "New Objectives", sum)) .. text
453 end
454
455=== modified file 'src/graphic/text/rt_parse.cc'
456--- src/graphic/text/rt_parse.cc 2017-12-06 06:47:34 +0000
457+++ src/graphic/text/rt_parse.cc 2018-01-06 11:27:52 +0000
458@@ -256,6 +256,7 @@
459
460 tc.allowed_children.insert("font");
461 tc.allowed_children.insert("space");
462+ tc.allowed_children.insert("vspace");
463 tc.allowed_children.insert("br");
464 tc.allowed_children.insert("img");
465 tc.allowed_children.insert("div");
466
467=== modified file 'src/graphic/text/rt_render.cc'
468--- src/graphic/text/rt_render.cc 2017-12-28 14:57:00 +0000
469+++ src/graphic/text/rt_render.cc 2018-01-06 11:27:52 +0000
470@@ -828,6 +828,7 @@
471 for (std::shared_ptr<RenderNode> n : nodes_to_render_) {
472 // TODO(GunChleoc): With div width=*, we are getting newline nodes here, which should have
473 // been consumed
474+ // https://bugs.launchpad.net/widelands/+bug/1738760
475 const auto& renderme = n->render(texture_cache);
476 for (auto& rendered_rect : renderme->rects) {
477 if (rendered_rect->was_visited()) {
478
479=== modified file 'src/wui/game_objectives_menu.cc'
480--- src/wui/game_objectives_menu.cc 2017-02-23 17:58:25 +0000
481+++ src/wui/game_objectives_menu.cc 2018-01-06 11:27:52 +0000
482@@ -86,5 +86,15 @@
483 * An entry in the objectives menu has been selected
484 */
485 void GameObjectivesMenu::selected(uint32_t const t) {
486- objectivetext.set_text(t == ListType::no_selection_index() ? std::string() : list[t].descr());
487+ const std::string text = t == ListType::no_selection_index() ? "" : list[t].descr();
488+ // TODO(GunChleoc): When all campaigns, scenarios and win conditions have been converted, simply add the text above.
489+ try {
490+ objectivetext.force_new_renderer();
491+ objectivetext.set_text(text);
492+ log("Objectives: using NEW font renderer.\n");
493+ } catch (const std::exception& e) {
494+ log("Objectives: falling back to OLD font renderer:\n%s\n%s\n", text.c_str(), e.what());
495+ objectivetext.force_new_renderer(false);
496+ objectivetext.set_text(text);
497+ }
498 }

Subscribers

People subscribed via source and target branches

to status/vote changes: