1 // Copyright (C) 2007, 2008, 2009 Ben Asselstine
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.
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.
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
21 #include <sigc++/functors/mem_fun.h>
23 #include "sage-dialog.h"
25 #include "glade-helpers.h"
26 #include "image-helpers.h"
27 #include "input-helpers.h"
28 #include "ucompose.hpp"
34 #include "rewardlist.h"
36 SageDialog::SageDialog(Sage *sage, Player *player, Hero *h, Ruin *r)
41 Glib::RefPtr<Gtk::Builder> xml
42 = Gtk::Builder::create_from_file(get_glade_path()
45 xml->get_widget("dialog", dialog);
47 window_closed.connect(sigc::mem_fun(dialog, &Gtk::Dialog::hide));
49 rewards_list = Gtk::ListStore::create(rewards_columns);
50 xml->get_widget("rewardtreeview", rewards_treeview);
51 rewards_treeview->set_model(rewards_list);
52 rewards_treeview->append_column("", rewards_columns.name);
53 rewards_treeview->get_selection()->signal_changed().connect
54 (sigc::mem_fun(*this, &SageDialog::on_reward_selected));
56 xml->get_widget("map_image", map_image);
57 xml->get_widget("continue_button", continue_button);
59 ruinmap = new RuinMap(ruin);
60 ruinmap->map_changed.connect(
61 sigc::mem_fun(this, &SageDialog::on_map_changed));
63 Gtk::EventBox *map_eventbox;
64 xml->get_widget("map_eventbox", map_eventbox);
66 set_title(_("A Sage!"));
68 for(Sage::iterator it = sage->begin(); it != sage->end(); it++)
71 continue_button->set_sensitive(false);
74 SageDialog::~SageDialog()
80 void SageDialog::set_parent_window(Gtk::Window &parent)
82 dialog->set_transient_for(parent);
83 //dialog->set_position(Gtk::WIN_POS_CENTER_ON_PARENT);
86 Reward *SageDialog::grabSelectedReward()
88 Glib::RefPtr<Gtk::TreeView::Selection> sel;
89 sel = rewards_treeview->get_selection();
90 Gtk::TreeModel::iterator it = sel->get_selected();
91 Gtk::TreeModel::Row row = *it;
92 return row[rewards_columns.reward];
95 void SageDialog::hide()
100 Reward *SageDialog::run()
103 ruinmap->draw(Playerlist::getActiveplayer());
105 Sound::getInstance()->playMusic("hero", 1);
108 Sound::getInstance()->haltMusic();
109 //okay, we have a reward selected
110 //now we return it (somehow)
112 Reward *reward = grabSelectedReward();
113 //is this in our one-time list anywhere?
115 Rewardlist *rlist = Rewardlist::getInstance();
116 Rewardlist::iterator it =
117 std::find (rlist->begin(), rlist->end(), reward);
118 if (it != rlist->end())
120 //yes, it's something on our one-time reward list!
121 //take if off our list, so we can't award it again
125 // fixme: remove all common rewards that isn't the one we selected
126 // the contents of the common rewards are a memory leak
131 void SageDialog::on_map_changed(Glib::RefPtr<Gdk::Pixmap> map)
133 map_image->property_pixmap() = map;
136 void SageDialog::addReward(Reward *reward)
138 Gtk::TreeIter i = rewards_list->append();
139 switch (reward->getType())
142 (*i)[rewards_columns.name] = _("Gold");
150 Reward_Map *m = static_cast<Reward_Map*>(reward);
156 case 0: name = "parchment map"; break;
157 case 1: name = "vellum map"; break;
158 case 2: name = "paper map"; break;
159 case 3: name = "torn paper map"; break;
160 case 4: name = "dusty map"; break;
161 case 5: name = "blood-stained map"; break;
165 (*i)[rewards_columns.name] = name;
171 Ruin *r = static_cast<Reward_Ruin*>(reward)->getRuin();
172 if (r->getReward() == NULL)
177 rew = Rewardlist::getInstance()->popRandomItemReward();
179 rew = Rewardlist::getInstance()->popRandomMapReward();
183 rew = Rewardlist::getInstance()->popRandomMapReward();
185 rew = Rewardlist::getInstance()->popRandomItemReward();
188 r->populateWithRandomReward();
192 if (r->getReward()->getType() == Reward::ITEM)
193 (*i)[rewards_columns.name] =
194 static_cast<Reward_Item*>(r->getReward())->getItem()->getName();
195 else if (r->getReward()->getType() == Reward::ALLIES)
196 (*i)[rewards_columns.name] = _("Allies");
197 else if (r->getReward()->getType() == Reward::MAP)
198 (*i)[rewards_columns.name] = r->getReward()->getName();
202 (*i)[rewards_columns.reward] = reward;
205 void SageDialog::on_reward_selected()
207 continue_button->set_sensitive(true);