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
17 #ifndef QUEST_CITY_SACK_H
18 #define QUEST_CITY_SACK_H
20 #include <sigc++/trackable.h>
28 //! A Quest where the Hero must sack a City owned by another Player.
30 * A hero that receives this quest has to sack a specific city to fulfill
31 * it. The Quest is completed when this happens, but the quest is expired if
32 * the user conquers the correct city but forgets to sack the city.
34 * Sacking involves cashing in all of the Army production bases that the City
35 * offers, except for the weakest one.
37 class QuestCitySack : public Quest, public sigc::trackable
40 //! Default constructor.
42 * Make a new city sacking quest.
44 * @param q_mgr The quests manager to associate this quest with.
45 * @param hero The Id of the Hero who is responsible for the quest.
47 QuestCitySack(QuestsManager& q_mgr, guint32 hero);
49 //! Loading constructor.
51 * @param q_mgr The quests manager to associate this quest with.
52 * @param helper The opened saved-game file to load this quest from.
54 QuestCitySack(QuestsManager& q_mgr, XML_Helper* helper);
56 // Construct from remote action.
57 QuestCitySack(QuestsManager& q_mgr, guint32 hero, guint32 target);
61 //! Return a description of how well the city sacking quest is going.
62 std::string getProgress() const;
64 //! Return a queue of strings to show when the quest is compeleted.
65 void getSuccessMsg(std::queue<std::string>& msgs) const;
67 //! Return a queue of strings to show when the quest has expired.
68 void getExpiredMsg(std::queue<std::string>& msgs) const;
70 //! Returns the id of the City object to be sacked.
71 guint32 getCityId() const {return d_city;}
74 // Methods that operate on the class data but do not modify the class.
76 //! Saves the sacking quest data to an opened saved-game file.
77 bool save(XML_Helper* helper) const;
79 //! Returns a pointer to the City object to be sacked.
80 City* getCity() const;
83 // Methods that need to be implemented from the superclass.
85 //! Callback for when an Army object is killed.
87 * @note This method is not used.
89 void armyDied(Army *a, bool heroIsCulprit);
91 //! Callback for when a City object is defeated.
93 * This method notifies the Quest that a City has fallen, and what the
94 * conquering action (pillage/sack/raze/occupy) was. It also notifies
95 * whether or not the hero responsible for this quest was involved in
96 * the conquering, and how much gold was taken as a result.
98 * If the city isn't sacked then the Quest is expired.
99 * If the city is sacked then the Quest is completed.
101 * @param city The City object that has been conquered.
102 * @param action What action was taken by the Player. See
103 * CityDefeatedAction for more information.
104 * @param heroIsCulprit Whether or not the Hero object associated with
105 * this Quest object is responsible for
106 * conquering the given City object.
107 * @param gold How many gold pieces were taken as a result
110 void cityAction(City *city, CityDefeatedAction action,
111 bool heroIsCulprit, int gold);
116 //! Returns whether or not this quest is impossible.
118 * Scans all City objects in the Citylist to see if there is one the
119 * active player can sack.
121 * @note This method is static because it is executed before the
122 * Quest is instantiated. It is also called from within the
123 * instantiated Quest.
125 * @param heroId The Id of the Hero responsible for the sacking quest.
127 * @return Whether or not the quest is possible.
129 static bool isFeasible(guint32 heroId);
133 //! Make a quest description about the city that needs to be sacked.
134 void initDescription();
136 //! Return a pointer to a random city not owned by the given player.
138 * Find a city to sack.
140 * Scan through all of the City objects in the Citylist for a city
141 * that is not owned by the given player or by neutral. Pick a random
142 * one that has more than 1 Army production base and return it.
144 * @param player The player whose City objects are exempt from being
145 * selected as a target for sacking.
147 * @return A pointer to a City object that can be sacked by the Hero.
148 * If no valid City objects are found, this method returns NULL.
150 static City* chooseToSack(Player *p);
152 //! The Id of the target City object to sack.