1 // Copyright (C) 2017, 2020 Ben Asselstine
2 //
3 //  This program is free software; you can redistribute it and/or modify
4 //  it under the terms of the GNU General Public License as published by
5 //  the Free Software Foundation; either version 3 of the License, or
6 //  (at your option) any later version.
7 //
8 //  This program is distributed in the hope that it will be useful,
9 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
10 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 //  GNU Library General Public License for more details.
12 //
13 //  You should have received a copy of the GNU General Public License
14 //  along with this program; if not, write to the Free Software
15 //  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
16 //  02110-1301, USA.
17 
18 #include "ScenarioMedia.h"
19 #include "defs.h"
20 #include "gui/image-helpers.h"
21 #include "xmlhelper.h"
22 #include "File.h"
23 #include "snd.h"
24 #include "tarfile.h"
25 
26 ScenarioMedia* ScenarioMedia::d_instance = 0;
27 
28 Glib::ustring ScenarioMedia::d_tag = "media";
29 
getInstance()30 ScenarioMedia* ScenarioMedia::getInstance()
31 {
32   if (!d_instance)
33     d_instance = new ScenarioMedia();
34 
35   return d_instance;
36 }
37 
getInstance(XML_Helper * helper)38 ScenarioMedia* ScenarioMedia::getInstance(XML_Helper* helper)
39 {
40   if (d_instance)
41     deleteInstance();
42 
43   d_instance = new ScenarioMedia(helper);
44   return d_instance;
45 }
46 
deleteInstance()47 void ScenarioMedia::deleteInstance()
48 {
49   if (d_instance != 0)
50     delete d_instance;
51 
52   d_instance = 0;
53 }
54 
ScenarioMedia()55 ScenarioMedia::ScenarioMedia()
56  : d_next_turn_name(""), d_city_defeated_name(""), d_winning_name(""),
57     d_male_hero_name(""), d_female_hero_name(""), d_ruin_success_name(""),
58     d_ruin_defeat_name(""), d_parley_offered_name(""),
59     d_parley_refused_name(""), d_hero_newlevel_male_name(""),
60     d_hero_newlevel_female_name(""), d_small_medals_name(""),
61     d_big_medals_name(""), d_commentator_name (""), d_bless_name(""),
62     d_hero_name(""), d_battle_name(""), d_defeat_name(""), d_victory_name(""),
63     d_back_name (""), d_next_turn_image(0), d_city_defeated_image(0),
64     d_winning_image(0), d_male_hero_image(0), d_female_hero_image(0),
65     d_ruin_success_image(0), d_ruin_defeat_image(0), d_parley_offered_image(0),
66     d_parley_refused_image(0), d_hero_newlevel_male_image(0),
67     d_hero_newlevel_male_mask(0), d_hero_newlevel_female_image(0),
68     d_hero_newlevel_female_mask(0), d_commentator_image(0)
69 {
70   for (guint32 i = 0; i < MEDAL_TYPES; i++)
71     {
72       d_big_medal_images.push_back (NULL);
73       d_small_medal_images.push_back (NULL);
74     }
75 }
76 
ScenarioMedia(XML_Helper * helper)77 ScenarioMedia::ScenarioMedia(XML_Helper *helper)
78  : d_next_turn_name(""), d_city_defeated_name(""), d_winning_name(""),
79     d_male_hero_name(""), d_female_hero_name(""), d_ruin_success_name(""),
80     d_ruin_defeat_name(""), d_parley_offered_name(""),
81     d_parley_refused_name(""), d_hero_newlevel_male_name(""),
82     d_hero_newlevel_female_name(""), d_small_medals_name(""),
83     d_big_medals_name(""), d_commentator_name(""), d_bless_name(""),
84     d_hero_name(""), d_battle_name(""), d_defeat_name(""), d_victory_name(""),
85     d_back_name (""), d_next_turn_image(0), d_city_defeated_image(0),
86     d_winning_image(0), d_male_hero_image(0), d_female_hero_image(0),
87     d_ruin_success_image(0), d_ruin_defeat_image(0), d_parley_offered_image(0),
88     d_parley_refused_image(0), d_hero_newlevel_male_image(0),
89     d_hero_newlevel_male_mask(0), d_hero_newlevel_female_image(0),
90     d_hero_newlevel_female_mask(0), d_commentator_image(0)
91 {
92   helper->getData(d_next_turn_name, "next_turn_image");
93   File::add_png_if_no_ext (d_next_turn_name);
94   helper->getData(d_city_defeated_name, "city_defeated_image");
95   File::add_png_if_no_ext (d_city_defeated_name);
96   helper->getData(d_winning_name, "winning_image");
97   File::add_png_if_no_ext (d_winning_name);
98   helper->getData(d_male_hero_name, "male_hero_image");
99   File::add_png_if_no_ext (d_male_hero_name);
100   helper->getData(d_female_hero_name, "female_hero_image");
101   File::add_png_if_no_ext (d_female_hero_name);
102   helper->getData(d_ruin_success_name, "ruin_success_image");
103   File::add_png_if_no_ext (d_ruin_success_name);
104   helper->getData(d_ruin_defeat_name, "ruin_defeat_image");
105   File::add_png_if_no_ext (d_ruin_defeat_name);
106   helper->getData(d_parley_offered_name, "parley_offered_image");
107   File::add_png_if_no_ext (d_parley_offered_name);
108   helper->getData(d_parley_refused_name, "parley_refused_image");
109   File::add_png_if_no_ext (d_parley_refused_name);
110   helper->getData(d_hero_newlevel_male_name, "hero_newlevel_male_image");
111   File::add_png_if_no_ext (d_hero_newlevel_male_name);
112   helper->getData(d_hero_newlevel_female_name,"hero_newlevel_female_image");
113   File::add_png_if_no_ext (d_hero_newlevel_female_name);
114   helper->getData(d_small_medals_name, "small_medals_image");
115   File::add_png_if_no_ext (d_small_medals_name);
116   helper->getData(d_big_medals_name, "big_medals_image");
117   File::add_png_if_no_ext (d_big_medals_name);
118   helper->getData(d_commentator_name, "commentator_image");
119   File::add_png_if_no_ext (d_commentator_name);
120   helper->getData(d_bless_name, "bless_sound");
121   helper->getData(d_hero_name,"d_hero_name");
122   helper->getData(d_battle_name,"d_battle_name");
123   helper->getData(d_defeat_name,"d_defeat_name");
124   helper->getData(d_victory_name,"d_victory_name");
125   helper->getData(d_back_name,"d_back_name");
126 }
127 
anyValueSet() const128 bool ScenarioMedia::anyValueSet() const
129 {
130   if (d_next_turn_name != "" ||
131       d_city_defeated_name != "" ||
132       d_winning_name != "" ||
133       d_male_hero_name != "" ||
134       d_female_hero_name != "" ||
135       d_ruin_success_name != "" ||
136       d_ruin_defeat_name != "" ||
137       d_parley_offered_name != "" ||
138       d_parley_refused_name != "" ||
139       d_hero_newlevel_male_name != "" ||
140       d_hero_newlevel_female_name != "" ||
141       d_small_medals_name != "" ||
142       d_big_medals_name != "" ||
143       d_commentator_name != "" ||
144       d_bless_name != "" ||
145       d_hero_name != "" ||
146       d_battle_name != "" ||
147       d_defeat_name != "" ||
148       d_victory_name != "" ||
149       d_back_name != "")
150     return true;
151   return false;
152 }
153 
save(XML_Helper * helper) const154 bool ScenarioMedia::save(XML_Helper* helper) const
155 {
156   if (!anyValueSet())
157     return true;
158   bool retval = true;
159   retval &= helper->openTag(ScenarioMedia::d_tag);
160   retval &= helper->saveData("next_turn_image", d_next_turn_name);
161   retval &= helper->saveData("city_defeated_image", d_city_defeated_name);
162   retval &= helper->saveData("winning_image", d_winning_name);
163   retval &= helper->saveData("male_hero_image", d_male_hero_name);
164   retval &= helper->saveData("female_hero_image", d_female_hero_name);
165   retval &= helper->saveData("ruin_success_image", d_ruin_success_name);
166   retval &= helper->saveData("ruin_defeat_image", d_ruin_defeat_name);
167   retval &= helper->saveData("parley_offered_image", d_parley_offered_name);
168   retval &= helper->saveData("parley_refused_image", d_parley_refused_name);
169   retval &= helper->saveData("hero_newlevel_male_image",
170                              d_hero_newlevel_male_name);
171   retval &= helper->saveData("hero_newlevel_female_image",
172                              d_hero_newlevel_female_name);
173   retval &= helper->saveData("small_medals_image", d_small_medals_name);
174   retval &= helper->saveData("big_medals_image", d_big_medals_name);
175   retval &= helper->saveData("commentator_image", d_commentator_name);
176   retval &= helper->saveData("bless_sound", d_bless_name);
177   retval &= helper->saveData("d_hero_name", d_hero_name);
178   retval &= helper->saveData("d_battle_name", d_battle_name);
179   retval &= helper->saveData("d_defeat_name", d_defeat_name);
180   retval &= helper->saveData("d_victory_name", d_victory_name);
181   retval &= helper->saveData("d_back_name", d_back_name);
182   retval &= helper->closeTag();
183   return retval;
184 }
185 
~ScenarioMedia()186 ScenarioMedia::~ScenarioMedia()
187 {
188   uninstantiateImages();
189   for (auto i: d_musicMap)
190     {
191       MusicItem *m = dynamic_cast<MusicItem*>(i.second);
192       if (m)
193         {
194           File::erase (m->file);
195           delete m;
196         }
197     }
198 }
199 
uninstantiateImages()200 void ScenarioMedia::uninstantiateImages()
201 {
202   if (d_next_turn_image)
203     delete d_next_turn_image;
204   d_next_turn_image = NULL;
205   if (d_city_defeated_image)
206     delete d_city_defeated_image;
207   d_city_defeated_image = NULL;
208   if (d_winning_image)
209     delete d_winning_image;
210   d_winning_image = NULL;
211   if (d_male_hero_image)
212     delete d_male_hero_image;
213   d_male_hero_image = NULL;
214   if (d_female_hero_image)
215     delete d_female_hero_image;
216   d_female_hero_image = NULL;
217   if (d_ruin_success_image)
218     delete d_ruin_success_image;
219   d_ruin_success_image = NULL;
220   if (d_ruin_defeat_image)
221     delete d_ruin_defeat_image;
222   d_ruin_defeat_image = NULL;
223   if (d_parley_offered_image)
224     delete d_parley_offered_image;
225   d_parley_offered_image = NULL;
226   if (d_parley_refused_image)
227     delete d_parley_refused_image;
228   d_parley_refused_image = NULL;
229   if (d_hero_newlevel_male_image)
230     delete d_hero_newlevel_male_image;
231   d_hero_newlevel_male_image = NULL;
232   if (d_hero_newlevel_male_mask)
233     delete d_hero_newlevel_male_mask;
234   d_hero_newlevel_male_mask = NULL;
235   if (d_hero_newlevel_female_image)
236     delete d_hero_newlevel_female_image;
237   d_hero_newlevel_female_image = NULL;
238   if (d_hero_newlevel_female_mask)
239     delete d_hero_newlevel_female_mask;
240   d_hero_newlevel_female_mask = NULL;
241   for (auto i : d_small_medal_images)
242     if (i)
243       delete i;
244   d_small_medal_images.clear();
245   for (auto i : d_big_medal_images)
246     if (i)
247       delete i;
248   d_big_medal_images.clear();
249   if (d_commentator_image)
250     delete d_commentator_image;
251   d_commentator_image = NULL;
252 }
253 
instantiateImageRow(Tar_Helper & t,Glib::ustring name,int num,std::vector<PixMask * > & images,bool & broken)254 void ScenarioMedia::instantiateImageRow(Tar_Helper &t, Glib::ustring name, int num, std::vector<PixMask *>&images, bool &broken)
255 {
256   if (name != "")
257     {
258       Glib::ustring n = t.getFile (name, broken);
259       if (!broken)
260         images = disassemble_row(n, num, broken);
261     }
262 }
263 
instantiateMaskedImage(Tar_Helper & t,Glib::ustring name,PixMask ** image,PixMask ** mask,bool & broken)264 void ScenarioMedia::instantiateMaskedImage(Tar_Helper &t, Glib::ustring name, PixMask **image, PixMask **mask, bool &broken)
265 {
266   if (name != "")
267     {
268       Glib::ustring n = t.getFile (name, broken);
269       if (!broken)
270         {
271           std::vector<PixMask* > half = disassemble_row(n, 2, broken);
272           if (!broken)
273             {
274               *image = half[0];
275               *mask = half[1];
276             }
277         }
278       if (broken)
279         return;
280     }
281 }
282 
instantiateImage(Tar_Helper & t,Glib::ustring name,PixMask ** image,bool & broken)283 void ScenarioMedia::instantiateImage(Tar_Helper &t, Glib::ustring name, PixMask **image, bool &broken)
284 {
285   if (name != "")
286     {
287       Glib::ustring n = t.getFile (name, broken);
288       if (!broken)
289         {
290           PixMask *i = PixMask::create (n, broken);
291           if (!broken)
292             *image = i;
293         }
294       if (broken)
295         return;
296     }
297 }
298 
copySound(Tar_Helper & t,Glib::ustring name,Glib::ustring piece,bool & broken)299 void ScenarioMedia::copySound(Tar_Helper &t, Glib::ustring name, Glib::ustring piece, bool &broken)
300 {
301   Glib::ustring n = t.getFile (name + ".ogg", broken);
302   if (!broken && n != "")
303     {
304       Glib::ustring tmpfile = File::get_tmp_file(".ogg");
305       File::copy (n, tmpfile);
306       MusicItem *item = new MusicItem();
307       if (item)
308         {
309           item->file = tmpfile;
310           item->background = false;
311           item->alias = "";
312           d_musicMap[piece] = item;
313         }
314     }
315 }
316 
copySounds(Tar_Helper & t,bool & broken)317 void ScenarioMedia::copySounds(Tar_Helper &t, bool &broken)
318 {
319   Glib::ustring f = "";
320   copySound(t, d_bless_name, "bless", broken);
321   copySound(t, d_hero_name, "hero", broken);
322   copySound(t, d_battle_name, "battle", broken);
323   copySound(t, d_defeat_name, "defeat", broken);
324   copySound(t, d_victory_name, "victory", broken);
325 
326   copySound(t, d_back_name, "back", broken);
327 
328   MusicItem *back = getSoundEffect("back");
329   if (back)
330     {
331       back->background = true;
332       d_bgMap.push_back("back");
333     }
334 }
335 
instantiateImages(Tar_Helper & t,bool & broken)336 void ScenarioMedia::instantiateImages(Tar_Helper &t, bool &broken)
337 {
338   instantiateImage (t, d_next_turn_name, &d_next_turn_image, broken);
339   if (!broken)
340     instantiateImage (t, d_city_defeated_name, &d_city_defeated_image, broken);
341   if (!broken)
342     instantiateImage (t, d_winning_name, &d_winning_image, broken);
343   if (!broken)
344     instantiateImage (t, d_male_hero_name, &d_male_hero_image, broken);
345   if (!broken)
346     instantiateImage (t, d_female_hero_name, &d_female_hero_image, broken);
347   if (!broken)
348     instantiateImage (t, d_ruin_success_name, &d_ruin_success_image, broken);
349   if (!broken)
350     instantiateImage (t, d_ruin_defeat_name, &d_ruin_defeat_image, broken);
351   if (!broken)
352     instantiateImage (t, d_parley_offered_name, &d_parley_offered_image,
353                       broken);
354   if (!broken)
355     instantiateImage (t, d_parley_refused_name, &d_parley_refused_image,
356                       broken);
357   if (!broken)
358     instantiateMaskedImage (t, d_hero_newlevel_male_name, &d_hero_newlevel_male_image, &d_hero_newlevel_male_mask, broken);
359   if (!broken)
360     instantiateMaskedImage (t, d_hero_newlevel_female_name, &d_hero_newlevel_female_image, &d_hero_newlevel_female_mask, broken);
361   if (!broken)
362     instantiateImageRow (t, d_small_medals_name, MEDAL_TYPES, d_small_medal_images, broken);
363   if (!broken)
364     instantiateImageRow (t, d_big_medals_name, MEDAL_TYPES, d_big_medal_images, broken);
365   if (!broken)
366     instantiateImage (t, d_commentator_name, &d_commentator_image, broken);
367 }
368 
getSoundEffect(Glib::ustring n)369 MusicItem* ScenarioMedia::getSoundEffect(Glib::ustring n)
370 {
371   return d_musicMap[n];
372 }
373 
getFilenames(std::list<Glib::ustring> & files)374 void ScenarioMedia::getFilenames(std::list<Glib::ustring> &files)
375 {
376   if (getNextTurnImageName() != "")
377     files.push_back (getNextTurnImageName());
378   if (getCityDefeatedImageName() != "")
379     files.push_back (getCityDefeatedImageName());
380   if (getWinningImageName() != "")
381     files.push_back (getWinningImageName());
382   if (getMaleHeroImageName() != "")
383     files.push_back (getMaleHeroImageName());
384   if (getFemaleHeroImageName() != "")
385     files.push_back (getFemaleHeroImageName());
386   if (getRuinSuccessImageName() != "")
387     files.push_back (getRuinSuccessImageName());
388   if (getRuinDefeatImageName() != "")
389     files.push_back (getRuinDefeatImageName());
390   if (getParleyOfferedImageName() != "")
391     files.push_back (getParleyOfferedImageName());
392   if (getParleyRefusedImageName() != "")
393     files.push_back (getParleyRefusedImageName());
394   if (getHeroNewLevelMaleImageName() != "")
395     files.push_back (getHeroNewLevelMaleImageName());
396   if (getHeroNewLevelFemaleImageName() != "")
397     files.push_back (getHeroNewLevelFemaleImageName());
398   if (getSmallMedalsImageName() != "")
399     files.push_back (getSmallMedalsImageName());
400   if (getBigMedalsImageName() != "")
401     files.push_back (getBigMedalsImageName());
402   if (getCommentatorImageName() != "")
403     files.push_back (getCommentatorImageName());
404   if (getBlessSoundName() != "")
405     files.push_back (getBlessSoundName() + ".ogg");
406   if (getHeroSoundName() != "")
407     files.push_back (getHeroSoundName() + ".ogg");
408   if (getBattleSoundName() != "")
409     files.push_back (getBattleSoundName() + ".ogg");
410   if (getDefeatSoundName() != "")
411     files.push_back (getDefeatSoundName() + ".ogg");
412   if (getVictorySoundName() != "")
413     files.push_back (getVictorySoundName() + ".ogg");
414   if (getBackSoundName() != "")
415     files.push_back (getBackSoundName() + ".ogg");
416 }
417 
getDefaultNextTurnImageFilename()418 Glib::ustring ScenarioMedia::getDefaultNextTurnImageFilename()
419 {
420   return File::getVariousFile("ship.png");
421 }
422 
getDefaultCityDefeatedImageFilename()423 Glib::ustring ScenarioMedia::getDefaultCityDefeatedImageFilename()
424 {
425   return File::getVariousFile("city_occupied.png");
426 }
427 
getDefaultWinningImageFilename()428 Glib::ustring ScenarioMedia::getDefaultWinningImageFilename()
429 {
430   return File::getVariousFile("win.png");
431 }
432 
getDefaultMaleHeroImageFilename()433 Glib::ustring ScenarioMedia::getDefaultMaleHeroImageFilename()
434 {
435   return File::getVariousFile("recruit_male.png");
436 }
437 
getDefaultFemaleHeroImageFilename()438 Glib::ustring ScenarioMedia::getDefaultFemaleHeroImageFilename()
439 {
440   return File::getVariousFile("recruit_female.png");
441 }
442 
getDefaultRuinSuccessImageFilename()443 Glib::ustring ScenarioMedia::getDefaultRuinSuccessImageFilename()
444 {
445   return File::getVariousFile("ruin_2.png");
446 }
447 
getDefaultRuinDefeatImageFilename()448 Glib::ustring ScenarioMedia::getDefaultRuinDefeatImageFilename()
449 {
450   return File::getVariousFile("ruin_1.png");
451 }
452 
getDefaultParleyOfferedImageFilename()453 Glib::ustring ScenarioMedia::getDefaultParleyOfferedImageFilename()
454 {
455   return File::getVariousFile("parley_offered.png");
456 }
457 
getDefaultParleyRefusedImageFilename()458 Glib::ustring ScenarioMedia::getDefaultParleyRefusedImageFilename()
459 {
460   return File::getVariousFile("parley_refused.png");
461 }
462 
getDefaultHeroNewLevelMaleImageFilename()463 Glib::ustring ScenarioMedia::getDefaultHeroNewLevelMaleImageFilename()
464 {
465   return File::getVariousFile("hero-newlevel-male.png");
466 }
467 
getDefaultHeroNewLevelFemaleImageFilename()468 Glib::ustring ScenarioMedia::getDefaultHeroNewLevelFemaleImageFilename()
469 {
470   return File::getVariousFile("hero-newlevel-female.png");
471 }
472 
getDefaultSmallMedalsImageFilename()473 Glib::ustring ScenarioMedia::getDefaultSmallMedalsImageFilename()
474 {
475   return File::getVariousFile("medals_mask.png");
476 }
477 
getDefaultBigMedalsImageFilename()478 Glib::ustring ScenarioMedia::getDefaultBigMedalsImageFilename()
479 {
480   return File::getVariousFile("bigmedals.png");
481 }
482 
getDefaultCommentatorImageFilename()483 Glib::ustring ScenarioMedia::getDefaultCommentatorImageFilename()
484 {
485   return File::getVariousFile("commentator.png");
486 }
487 
getDefaultBlessSoundFilename()488 Glib::ustring ScenarioMedia::getDefaultBlessSoundFilename()
489 {
490   return Snd::getInstance()->getFile("bless");
491 }
492 
getDefaultHeroSoundFilename()493 Glib::ustring ScenarioMedia::getDefaultHeroSoundFilename()
494 {
495   return Snd::getInstance()->getFile("hero");
496 }
497 
getDefaultBattleSoundFilename()498 Glib::ustring ScenarioMedia::getDefaultBattleSoundFilename()
499 {
500   return Snd::getInstance()->getFile("battle");
501 }
502 
getDefaultDefeatSoundFilename()503 Glib::ustring ScenarioMedia::getDefaultDefeatSoundFilename()
504 {
505   return Snd::getInstance()->getFile("defeat");
506 }
507 
getDefaultVictorySoundFilename()508 Glib::ustring ScenarioMedia::getDefaultVictorySoundFilename()
509 {
510   return Snd::getInstance()->getFile("victory");
511 }
512 
getDefaultBackSoundFilename()513 Glib::ustring ScenarioMedia::getDefaultBackSoundFilename()
514 {
515   return Snd::getInstance()->getFile("back");
516 }
517 
clearNextTurnImage(bool clear_name)518 void ScenarioMedia::clearNextTurnImage(bool clear_name)
519 {
520   if (clear_name)
521     setNextTurnImageName ("");
522   PixMask *p = getNextTurnImage ();
523   if (p)
524     delete p;
525   setNextTurnImage (NULL);
526 }
527 
clearCityDefeatedImage(bool clear_name)528 void ScenarioMedia::clearCityDefeatedImage(bool clear_name)
529 {
530   if (clear_name)
531     setCityDefeatedImageName ("");
532   PixMask *p = getCityDefeatedImage ();
533   if (p)
534     delete p;
535   setCityDefeatedImage (NULL);
536 }
537 
clearWinningImage(bool clear_name)538 void ScenarioMedia::clearWinningImage(bool clear_name)
539 {
540   if (clear_name)
541     setWinningImageName ("");
542   PixMask *p = getWinningImage ();
543   if (p)
544     delete p;
545   setWinningImage (NULL);
546 }
547 
clearMaleHeroImage(bool clear_name)548 void ScenarioMedia::clearMaleHeroImage(bool clear_name)
549 {
550   if (clear_name)
551     setMaleHeroImageName ("");
552   PixMask *p = getMaleHeroImage ();
553   if (p)
554     delete p;
555   setMaleHeroImage (NULL);
556 }
557 
clearFemaleHeroImage(bool clear_name)558 void ScenarioMedia::clearFemaleHeroImage(bool clear_name)
559 {
560   if (clear_name)
561     setFemaleHeroImageName ("");
562   PixMask *p = getFemaleHeroImage ();
563   if (p)
564     delete p;
565   setFemaleHeroImage (NULL);
566 }
567 
clearRuinSuccessImage(bool clear_name)568 void ScenarioMedia::clearRuinSuccessImage(bool clear_name)
569 {
570   if (clear_name)
571     setRuinSuccessImageName ("");
572   PixMask *p = getRuinSuccessImage ();
573   if (p)
574     delete p;
575   setRuinSuccessImage (NULL);
576 }
577 
clearRuinDefeatImage(bool clear_name)578 void ScenarioMedia::clearRuinDefeatImage(bool clear_name)
579 {
580   if (clear_name)
581     setRuinDefeatImageName ("");
582   PixMask *p = getRuinDefeatImage ();
583   if (p)
584     delete p;
585   setRuinDefeatImage (NULL);
586 }
587 
clearParleyOfferedImage(bool clear_name)588 void ScenarioMedia::clearParleyOfferedImage(bool clear_name)
589 {
590   if (clear_name)
591     setParleyOfferedImageName ("");
592   PixMask *p = getParleyOfferedImage ();
593   if (p)
594     delete p;
595   setParleyOfferedImage (NULL);
596 }
597 
clearParleyRefusedImage(bool clear_name)598 void ScenarioMedia::clearParleyRefusedImage(bool clear_name)
599 {
600   if (clear_name)
601     setParleyRefusedImageName ("");
602   PixMask *p = getParleyRefusedImage ();
603   if (p)
604     delete p;
605   setParleyRefusedImage (NULL);
606 }
607 
clearHeroNewLevelMaleImage(bool clear_name)608 void ScenarioMedia::clearHeroNewLevelMaleImage (bool clear_name)
609 {
610   if (clear_name)
611     setHeroNewLevelMaleImageName ("");
612   PixMask *p = getHeroNewLevelMaleImage ();
613   if (p)
614     delete p;
615   setHeroNewLevelMaleImage (NULL);
616 
617   p = getHeroNewLevelMaleMask ();
618   if (p)
619     delete p;
620   setHeroNewLevelMaleMask (NULL);
621 }
622 
clearHeroNewLevelFemaleImage(bool clear_name)623 void ScenarioMedia::clearHeroNewLevelFemaleImage (bool clear_name)
624 {
625   if (clear_name)
626     setHeroNewLevelFemaleImageName ("");
627   PixMask *p = getHeroNewLevelFemaleImage ();
628   if (p)
629     delete p;
630   setHeroNewLevelFemaleImage (NULL);
631 
632   p = getHeroNewLevelFemaleMask ();
633   if (p)
634     delete p;
635   setHeroNewLevelFemaleMask (NULL);
636 }
637 
clearSmallMedalImage(bool clear_name)638 void ScenarioMedia::clearSmallMedalImage(bool clear_name)
639 {
640   if (clear_name)
641     setSmallMedalsImageName ("");
642   for (guint32 i = 0; i < MEDAL_TYPES; i++)
643     {
644       PixMask *p = getSmallMedalImage (i);
645       if (p)
646         delete p;
647       setSmallMedalsImage (i, NULL);
648     }
649 }
650 
clearBigMedalImage(bool clear_name)651 void ScenarioMedia::clearBigMedalImage(bool clear_name)
652 {
653   if (clear_name)
654     setBigMedalsImageName ("");
655   for (guint32 i = 0; i < MEDAL_TYPES; i++)
656     {
657       PixMask *p = getBigMedalImage (i);
658       if (p)
659         delete p;
660       setBigMedalsImage (i, NULL);
661     }
662 }
663 
clearCommentatorImage(bool clear_name)664 void ScenarioMedia::clearCommentatorImage(bool clear_name)
665 {
666   if (clear_name)
667     setCommentatorImageName ("");
668   PixMask *p = getCommentatorImage ();
669   if (p)
670     delete p;
671   setCommentatorImage (NULL);
672 }
673 
instantiateNextTurnImage(TarFile * t)674 bool ScenarioMedia::instantiateNextTurnImage(TarFile *t)
675 {
676   Glib::ustring imgname = getNextTurnImageName();
677   if (imgname.empty() == false)
678     {
679       Glib::ustring filename = t->getFileFromConfigurationFile(imgname);
680       if (filename.empty () == false)
681         {
682           bool broken = false;
683           PixMask *p = PixMask::create (filename, broken);
684           File::erase (filename);
685           if (!broken)
686             {
687               clearNextTurnImage (false);
688               setNextTurnImage (p);
689             }
690           else
691             return false;
692         }
693       else
694         return false;
695     }
696   return true;
697 }
698 
instantiateCityDefeatedImage(TarFile * t)699 bool ScenarioMedia::instantiateCityDefeatedImage(TarFile *t)
700 {
701   Glib::ustring imgname = getCityDefeatedImageName();
702   if (imgname.empty() == false)
703     {
704       Glib::ustring filename = t->getFileFromConfigurationFile(imgname);
705       if (filename.empty () == false)
706         {
707           bool broken = false;
708           PixMask *p = PixMask::create (filename, broken);
709           File::erase (filename);
710           if (!broken)
711             {
712               clearCityDefeatedImage (false);
713               setCityDefeatedImage (p);
714             }
715           else
716             return false;
717         }
718       else
719         return false;
720     }
721   return true;
722 }
723 
instantiateWinningImage(TarFile * t)724 bool ScenarioMedia::instantiateWinningImage(TarFile *t)
725 {
726   Glib::ustring imgname = getWinningImageName();
727   if (imgname.empty() == false)
728     {
729       Glib::ustring filename = t->getFileFromConfigurationFile(imgname);
730       if (filename.empty () == false)
731         {
732           bool broken = false;
733           PixMask *p = PixMask::create (filename, broken);
734           File::erase (filename);
735           if (!broken)
736             {
737               clearWinningImage (false);
738               setWinningImage (p);
739             }
740           else
741             return false;
742         }
743       else
744         return false;
745     }
746   return true;
747 }
748 
instantiateMaleHeroImage(TarFile * t)749 bool ScenarioMedia::instantiateMaleHeroImage(TarFile *t)
750 {
751   Glib::ustring imgname = getMaleHeroImageName();
752   if (imgname.empty() == false)
753     {
754       Glib::ustring filename = t->getFileFromConfigurationFile(imgname);
755       if (filename.empty () == false)
756         {
757           bool broken = false;
758           PixMask *p = PixMask::create (filename, broken);
759           File::erase (filename);
760           if (!broken)
761             {
762               clearMaleHeroImage (false);
763               setMaleHeroImage (p);
764             }
765           else
766             return false;
767         }
768       else
769         return false;
770     }
771   return true;
772 }
773 
instantiateFemaleHeroImage(TarFile * t)774 bool ScenarioMedia::instantiateFemaleHeroImage(TarFile *t)
775 {
776   Glib::ustring imgname = getFemaleHeroImageName();
777   if (imgname.empty() == false)
778     {
779       Glib::ustring filename = t->getFileFromConfigurationFile(imgname);
780       if (filename.empty () == false)
781         {
782           bool broken = false;
783           PixMask *p = PixMask::create (filename, broken);
784           File::erase (filename);
785           if (!broken)
786             {
787               clearFemaleHeroImage (false);
788               setFemaleHeroImage (p);
789             }
790           else
791             return false;
792         }
793       else
794         return false;
795     }
796   return true;
797 }
798 
instantiateRuinSuccessImage(TarFile * t)799 bool ScenarioMedia::instantiateRuinSuccessImage(TarFile *t)
800 {
801   Glib::ustring imgname = getRuinSuccessImageName();
802   if (imgname.empty() == false)
803     {
804       Glib::ustring filename = t->getFileFromConfigurationFile(imgname);
805       if (filename.empty () == false)
806         {
807           bool broken = false;
808           PixMask *p = PixMask::create (filename, broken);
809           File::erase (filename);
810           if (!broken)
811             {
812               clearRuinSuccessImage (false);
813               setRuinSuccessImage (p);
814             }
815           else
816             return false;
817         }
818       else
819         return false;
820     }
821   return true;
822 }
823 
instantiateRuinDefeatImage(TarFile * t)824 bool ScenarioMedia::instantiateRuinDefeatImage(TarFile *t)
825 {
826   Glib::ustring imgname = getRuinDefeatImageName();
827   if (imgname.empty() == false)
828     {
829       Glib::ustring filename = t->getFileFromConfigurationFile(imgname);
830       if (filename.empty () == false)
831         {
832           bool broken = false;
833           PixMask *p = PixMask::create (filename, broken);
834           File::erase (filename);
835           if (!broken)
836             {
837               clearRuinDefeatImage (false);
838               setRuinDefeatImage (p);
839             }
840           else
841             return false;
842         }
843       else
844         return false;
845     }
846   return true;
847 }
848 
instantiateParleyOfferedImage(TarFile * t)849 bool ScenarioMedia::instantiateParleyOfferedImage(TarFile *t)
850 {
851   Glib::ustring imgname = getParleyOfferedImageName();
852   if (imgname.empty() == false)
853     {
854       Glib::ustring filename = t->getFileFromConfigurationFile(imgname);
855       if (filename.empty () == false)
856         {
857           bool broken = false;
858           PixMask *p = PixMask::create (filename, broken);
859           File::erase (filename);
860           if (!broken)
861             {
862               clearParleyOfferedImage (false);
863               setParleyOfferedImage (p);
864             }
865           else
866             return false;
867         }
868       else
869         return false;
870     }
871   return true;
872 }
873 
instantiateParleyRefusedImage(TarFile * t)874 bool ScenarioMedia::instantiateParleyRefusedImage(TarFile *t)
875 {
876   Glib::ustring imgname = getParleyRefusedImageName();
877   if (imgname.empty() == false)
878     {
879       Glib::ustring filename = t->getFileFromConfigurationFile(imgname);
880       if (filename.empty () == false)
881         {
882           bool broken = false;
883           PixMask *p = PixMask::create (filename, broken);
884           File::erase (filename);
885           if (!broken)
886             {
887               clearParleyRefusedImage (false);
888               setParleyRefusedImage (p);
889             }
890           else
891             return false;
892         }
893       else
894         return false;
895     }
896   return true;
897 }
898 
instantiateSmallMedalImage(TarFile * t)899 bool ScenarioMedia::instantiateSmallMedalImage(TarFile *t)
900 {
901   Glib::ustring imgname = getSmallMedalsImageName();
902   if (imgname.empty() == false)
903     {
904       Glib::ustring filename = t->getFileFromConfigurationFile(imgname);
905       if (filename.empty () == false)
906         {
907           bool broken = false;
908           std::vector<PixMask *> images =
909             disassemble_row(filename, MEDAL_TYPES, broken);
910           File::erase (filename);
911           if (!broken)
912             {
913               clearSmallMedalImage (false);
914               for (guint32  i = 0; i < MEDAL_TYPES; i++)
915                 setSmallMedalsImage (i, images[i]);
916             }
917         }
918       else
919         return false;
920     }
921   return true;
922 }
923 
instantiateBigMedalImage(TarFile * t)924 bool ScenarioMedia::instantiateBigMedalImage(TarFile *t)
925 {
926   Glib::ustring imgname = getBigMedalsImageName();
927   if (imgname.empty() == false)
928     {
929       Glib::ustring filename = t->getFileFromConfigurationFile(imgname);
930       if (filename.empty () == false)
931         {
932           bool broken = false;
933           std::vector<PixMask *> images =
934             disassemble_row(filename, MEDAL_TYPES, broken);
935           File::erase (filename);
936           if (!broken)
937             {
938               clearBigMedalImage (false);
939               for (guint32 i = 0; i < MEDAL_TYPES; i++)
940                 setBigMedalsImage (i, images[i]);
941             }
942         }
943       else
944         return false;
945     }
946   return true;
947 }
948 
instantiateHeroNewLevelMaleImage(TarFile * t)949 bool ScenarioMedia::instantiateHeroNewLevelMaleImage (TarFile *t)
950 {
951   bool broken = false;
952   Glib::ustring imgname = getHeroNewLevelMaleImageName ();
953 
954   if (imgname.empty () == false)
955     {
956       Glib::ustring filename = t->getFileFromConfigurationFile(imgname);
957       if (filename.empty () == false)
958         {
959           std::vector<PixMask* > half = disassemble_row(filename, 2, broken);
960           File::erase (filename);
961           if (!broken)
962             {
963               clearHeroNewLevelMaleImage (false);
964               setHeroNewLevelMaleImage(half[0]);
965               setHeroNewLevelMaleMask (half[1]);
966             }
967         }
968     }
969   return broken;
970 }
971 
instantiateHeroNewLevelFemaleImage(TarFile * t)972 bool ScenarioMedia::instantiateHeroNewLevelFemaleImage (TarFile *t)
973 {
974   bool broken = false;
975   Glib::ustring imgname = getHeroNewLevelFemaleImageName ();
976 
977   if (imgname.empty () == false)
978     {
979       Glib::ustring filename = t->getFileFromConfigurationFile(imgname);
980       if (filename.empty () == false)
981         {
982           std::vector<PixMask* > half = disassemble_row(filename, 2, broken);
983           File::erase (filename);
984           if (!broken)
985             {
986               clearHeroNewLevelFemaleImage (false);
987               setHeroNewLevelFemaleImage(half[0]);
988               setHeroNewLevelFemaleMask (half[1]);
989             }
990         }
991     }
992   return broken;
993 }
994 
instantiateCommentatorImage(TarFile * t)995 bool ScenarioMedia::instantiateCommentatorImage(TarFile *t)
996 {
997   Glib::ustring imgname = getCommentatorImageName();
998   if (imgname.empty() == false)
999     {
1000       Glib::ustring filename = t->getFileFromConfigurationFile(imgname);
1001       if (filename.empty () == false)
1002         {
1003           bool broken = false;
1004           PixMask *p = PixMask::create (filename, broken);
1005           File::erase (filename);
1006           if (!broken)
1007             {
1008               clearCommentatorImage (false);
1009               setCommentatorImage (p);
1010             }
1011           else
1012             return false;
1013         }
1014       else
1015         return false;
1016     }
1017   return true;
1018 }
1019