1 //  Copyright (C) 2007, 2008, 2009, 2014, 2015, 2017 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 <config.h>
19 
20 #include <gtkmm.h>
21 #include <sigc++/functors/mem_fun.h>
22 
23 #include "SightMap.h"
24 #include "sage-dialog.h"
25 
26 #include "defs.h"
27 #include "snd.h"
28 #include "ruin.h"
29 #include "rewardlist.h"
30 #include "playerlist.h"
31 #include "Item.h"
32 #include "rnd.h"
33 #include "ucompose.hpp"
34 #include "armyproto.h"
35 
36 #define method(x) sigc::mem_fun(*this, &SageDialog::x)
37 
SageDialog(Gtk::Window & parent,Sage * s,Hero * h,Ruin * r)38 SageDialog::SageDialog(Gtk::Window &parent, Sage *s, Hero *h, Ruin *r)
39  : LwDialog(parent, "sage-dialog.ui")
40 {
41   ruin = r;
42   hero = h;
43   sage = s;
44 
45   rewards_list = Gtk::ListStore::create(rewards_columns);
46   xml->get_widget("rewardtreeview", rewards_treeview);
47   rewards_treeview->set_model(rewards_list);
48   rewards_treeview->append_column("", rewards_columns.name);
49   rewards_treeview->get_selection()->signal_changed().connect
50     (method(on_reward_selected));
51 
52   xml->get_widget("map_image", map_image);
53   xml->get_widget("continue_button", continue_button);
54 
55   ruinmap = new RuinMap(ruin, NULL);
56   ruinmap->map_changed.connect(method(on_map_changed));
57 
58   Gtk::EventBox *map_eventbox;
59   xml->get_widget("map_eventbox", map_eventbox);
60 
61   dialog->set_title(_("A Sage!"));
62 
63   for(Sage::iterator it = sage->begin(); it != sage->end(); it++)
64     addReward(*it);
65 
66   continue_button->set_sensitive(false);
67 }
68 
grabSelectedReward()69 Reward *SageDialog::grabSelectedReward()
70 {
71   Glib::RefPtr<Gtk::TreeView::Selection> sel = rewards_treeview->get_selection();
72   Gtk::TreeModel::iterator it = sel->get_selected();
73   Gtk::TreeModel::Row row = *it;
74   return row[rewards_columns.reward];
75 }
76 
run()77 Reward *SageDialog::run()
78 {
79   ruinmap->resize();
80   ruinmap->draw();
81 
82   Snd::getInstance()->play("hero", 1);
83   dialog->show_all();
84   dialog->run();
85   Snd::getInstance()->halt();
86 
87   sage->selectReward(grabSelectedReward());
88   return sage->getSelectedReward();
89 }
90 
on_map_changed(Cairo::RefPtr<Cairo::Surface> map)91 void SageDialog::on_map_changed(Cairo::RefPtr<Cairo::Surface> map)
92 {
93   map_image->property_pixbuf() =
94     Gdk::Pixbuf::create(map, 0, 0, ruinmap->get_width(), ruinmap->get_height());
95 }
96 
addReward(Reward * reward)97 void SageDialog::addReward(Reward *reward)
98 {
99   Gtk::TreeIter i = rewards_list->append();
100   switch (reward->getType())
101     {
102     case Reward::GOLD:
103       (*i)[rewards_columns.name] = _("Gold");
104       break;
105     case Reward::ITEM:
106       {
107         Reward_Item *item = static_cast<Reward_Item*>(reward);
108         (*i)[rewards_columns.name] = item->getItem()->getName();
109       }
110       break;
111     case Reward::ALLIES:
112       (*i)[rewards_columns.name] = _("Allies");
113       break;
114     case Reward::MAP:
115 	{
116 	  Reward_Map *m = static_cast<Reward_Map*>(reward);
117 	  (*i)[rewards_columns.name] = String::capitalize(m->getName());
118 	}
119       break;
120     case Reward::RUIN:
121         {
122 	  Reward_Ruin *rr = static_cast<Reward_Ruin*>(reward);
123           Ruin *r = rr->getRuin();
124           if (r->getReward()->getType() == Reward::ITEM)
125             (*i)[rewards_columns.name] =
126               static_cast<Reward_Item*>(r->getReward())->getItem()->getName();
127           else if (r->getReward()->getType() == Reward::ALLIES)
128             (*i)[rewards_columns.name] = _("Allies");
129           else if (r->getReward()->getType() == Reward::MAP)
130             (*i)[rewards_columns.name] = r->getReward()->getName();
131         }
132       break;
133     }
134   (*i)[rewards_columns.reward] = reward;
135 }
136 
on_reward_selected()137 void SageDialog::on_reward_selected()
138 {
139   continue_button->set_sensitive(true);
140 }
141 
142