initial commit, lordsawar source, slightly modified
[lordsawar] / src / gui / sage-dialog.cpp
1 //  Copyright (C) 2007, 2008, 2009 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 "sage-dialog.h"
24
25 #include "glade-helpers.h"
26 #include "image-helpers.h"
27 #include "input-helpers.h"
28 #include "ucompose.hpp"
29 #include "defs.h"
30 #include "GameMap.h"
31 #include "File.h"
32 #include "sound.h"
33 #include "ruin.h"
34 #include "rewardlist.h"
35
36 SageDialog::SageDialog(Sage *sage, Player *player, Hero *h, Ruin *r)
37 {
38     ruin = r;
39     hero = h;
40     
41     Glib::RefPtr<Gtk::Builder> xml
42         = Gtk::Builder::create_from_file(get_glade_path()
43                                     + "/sage-dialog.ui");
44
45     xml->get_widget("dialog", dialog);
46     decorate(dialog);
47     window_closed.connect(sigc::mem_fun(dialog, &Gtk::Dialog::hide));
48
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));
55
56     xml->get_widget("map_image", map_image);
57     xml->get_widget("continue_button", continue_button);
58
59     ruinmap = new RuinMap(ruin);
60     ruinmap->map_changed.connect(
61         sigc::mem_fun(this, &SageDialog::on_map_changed));
62
63     Gtk::EventBox *map_eventbox;
64     xml->get_widget("map_eventbox", map_eventbox);
65
66     set_title(_("A Sage!"));
67
68     for(Sage::iterator it = sage->begin(); it != sage->end(); it++)
69       addReward(*it);
70
71   continue_button->set_sensitive(false);
72
73 }
74 SageDialog::~SageDialog()
75 {
76   delete dialog;
77   delete ruinmap;
78 }
79
80 void SageDialog::set_parent_window(Gtk::Window &parent)
81 {
82     dialog->set_transient_for(parent);
83     //dialog->set_position(Gtk::WIN_POS_CENTER_ON_PARENT);
84 }
85
86 Reward *SageDialog::grabSelectedReward()
87 {
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];
93 }
94
95 void SageDialog::hide()
96 {
97   dialog->hide();
98 }
99
100 Reward *SageDialog::run()
101 {
102     ruinmap->resize();
103     ruinmap->draw(Playerlist::getActiveplayer());
104
105     Sound::getInstance()->playMusic("hero", 1);
106     dialog->show_all();
107     dialog->run();
108     Sound::getInstance()->haltMusic();
109     //okay, we have a reward selected
110    //now we return it (somehow)
111   
112     Reward *reward = grabSelectedReward();
113     //is this in our one-time list anywhere?
114
115     Rewardlist *rlist = Rewardlist::getInstance();
116     Rewardlist::iterator it = 
117       std::find (rlist->begin(), rlist->end(), reward);
118     if (it != rlist->end())
119       {
120         //yes, it's something on our one-time reward list!
121         //take if off our list, so we can't award it again
122         rlist->erase(it);
123       }
124
125     // fixme: remove all common rewards that isn't the one we selected
126     // the contents of the common rewards are a memory leak
127
128     return reward;
129 }
130
131 void SageDialog::on_map_changed(Glib::RefPtr<Gdk::Pixmap> map)
132 {
133   map_image->property_pixmap() = map;
134 }
135
136 void SageDialog::addReward(Reward *reward)
137 {
138   Gtk::TreeIter i = rewards_list->append();
139   switch (reward->getType())
140     {
141     case Reward::GOLD:
142       (*i)[rewards_columns.name] = _("Gold");
143       break;
144     case Reward::ITEM:
145     case Reward::ALLIES:
146       break;
147     case Reward::MAP:
148         {
149           std::string name;
150           Reward_Map *m = static_cast<Reward_Map*>(reward);
151           name  = m->getName();
152           if (name == "")
153             {
154               switch (rand() % 6)
155                 {
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;
162                 }
163             }
164             
165           (*i)[rewards_columns.name] = name;
166         }
167
168       break;
169     case Reward::RUIN:
170         {
171           Ruin *r = static_cast<Reward_Ruin*>(reward)->getRuin();
172           if (r->getReward() == NULL)
173             {
174               Reward *rew  = NULL;
175               if (rand() % 2 == 0)
176                 {
177                   rew = Rewardlist::getInstance()->popRandomItemReward();
178                   if (!rew)
179                     rew = Rewardlist::getInstance()->popRandomMapReward();
180                 }
181               else
182                 {
183                   rew = Rewardlist::getInstance()->popRandomMapReward();
184                   if (!rew)
185                     rew = Rewardlist::getInstance()->popRandomItemReward();
186                 }
187               if (!rew)
188                 r->populateWithRandomReward();
189               else
190                 r->setReward(rew);
191             }
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();
199         }
200       break;
201     }
202   (*i)[rewards_columns.reward] = reward;
203 }
204
205 void SageDialog::on_reward_selected()
206 {
207   continue_button->set_sensitive(true);
208 }
209