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