Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/src/orxonox/gametypes/TeamBaseMatch.cc @ 5929

Last change on this file since 5929 was 5929, checked in by rgrieder, 15 years ago

Merged core5 branch back to the trunk.
Key features include clean level unloading and an extended XML event system.

Two important notes:
Delete your keybindings.ini files! * or you will still get parser errors when loading the key bindings.
Delete build_dir/lib/modules/libgamestates.module! * or orxonox won't start.
Best thing to do is to delete the build folder ;)

  • Property svn:eol-style set to native
File size: 8.2 KB
Line 
1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *   Author:
23 *      Val Mikos
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29#include "TeamBaseMatch.h"
30
31#include "core/CoreIncludes.h"
32#include "core/Executor.h"
33#include "worldentities/pawns/TeamBaseMatchBase.h"
34#include "infos/PlayerInfo.h"
35
36namespace orxonox
37{
38    CreateUnloadableFactory(TeamBaseMatch);
39
40    TeamBaseMatch::TeamBaseMatch(BaseObject* creator) : TeamDeathmatch(creator)
41    {
42        RegisterObject(TeamBaseMatch);
43
44        this->scoreTimer_.setTimer(10, true, createExecutor(createFunctor(&TeamBaseMatch::winPoints, this)));
45        this->outputTimer_.setTimer(10, true, createExecutor(createFunctor(&TeamBaseMatch::showPoints, this)));
46
47        this->pointsTeam1_ = 0;
48        this->pointsTeam2_ = 0;
49
50        this->setHUDTemplate("TeamBaseMatchHUD");
51    }
52
53    // Change the control of the defeated base and respawn it with its initial health
54    bool TeamBaseMatch::allowPawnDeath(Pawn* victim, Pawn* originator)
55    {
56        TeamBaseMatchBase* base = orxonox_cast<TeamBaseMatchBase*>(victim);
57        if (base)
58        {
59            if (!originator)
60                return false;
61
62            std::set<TeamBaseMatchBase*>::const_iterator it = this->bases_.find(base);
63            if (it != this->bases_.end())
64            {
65                int teamnr = this->getTeam(originator->getPlayer());
66                if (teamnr == 0)
67                {
68                    base->setState(BaseState::ControlTeam1);
69                    this->gtinfo_->sendAnnounceMessage("The red team captured a base");
70                }
71                if (teamnr == 1)
72                {
73                    base->setState(BaseState::ControlTeam2);
74                    this->gtinfo_->sendAnnounceMessage("The blue team captured a base");
75                }
76            }
77
78            victim->setHealth(victim->getInitialHealth());
79            return false;
80        }
81
82        return TeamDeathmatch::allowPawnDeath(victim, originator);
83    }
84
85
86    // if the player is in the same team as the base, he can't make any damage to it
87    bool TeamBaseMatch::allowPawnDamage(Pawn* victim, Pawn* originator)
88    {
89        TeamBaseMatchBase* base = orxonox_cast<TeamBaseMatchBase*>(victim);
90        if (base)
91        {
92            std::set<TeamBaseMatchBase*>::const_iterator it = this->bases_.find(base);
93            if (it != this->bases_.end())
94                return (!this->pawnsAreInTheSameTeam(originator, base));
95        }
96        return TeamDeathmatch::allowPawnDamage(victim, originator);
97    }
98
99    bool TeamBaseMatch::pawnsAreInTheSameTeam(Pawn* pawn1, TeamBaseMatchBase* base)
100    {
101        if (pawn1 && base)
102        {
103            std::map<PlayerInfo*, int>::const_iterator it1 = this->teamnumbers_.find(pawn1->getPlayer());
104            int teamnrbase = -1;
105            int teamnrplayer = this->getTeam(pawn1->getPlayer());
106
107            switch (base->getState())
108            {
109                case BaseState::ControlTeam1:
110                    teamnrbase = 0;
111                    break;
112                case BaseState::ControlTeam2:
113                    teamnrbase = 1;
114                    break;
115                case BaseState::Uncontrolled:
116                default:
117                    teamnrbase = -1;
118            }
119
120            if (teamnrbase == teamnrplayer)
121                return true;
122        }
123        return false;
124    }
125
126
127
128
129
130    // collect Points for killing oppenents
131    void TeamBaseMatch::playerScored(PlayerInfo* player)
132    {
133        int teamnr = this->getTeam(player);
134        this->addTeamPoints(teamnr, 5);
135    }
136
137    // show points or each interval of time
138    void TeamBaseMatch::showPoints()
139    {
140        if (!this->hasStarted() || this->hasEnded())
141            return;
142
143        COUT(0) << "Points standing:" << std::endl << "Team 1: "<< pointsTeam1_ << std::endl << "Team 2: " << pointsTeam2_ << std::endl;
144        if(pointsTeam1_ >=1700 && pointsTeam1_ < 2000) COUT(0) << "Team 1 is near victory!" << std::endl;
145        if(pointsTeam2_ >=1700 && pointsTeam2_ < 2000) COUT(0) << "Team 2 is near victory!" << std::endl;
146    }
147
148
149    // collect Points while controlling Bases
150    void TeamBaseMatch::winPoints()
151    {
152        int amountControlled = 0;
153        int amountControlled2 = 0;
154
155        for (std::set<TeamBaseMatchBase*>::const_iterator it = this->bases_.begin(); it != this->bases_.end(); ++it)
156        {
157            if((*it)->getState() == BaseState::ControlTeam1)
158            {
159                amountControlled++;
160            }
161            if((*it)->getState() == BaseState::ControlTeam2)
162            {
163                amountControlled2++;
164            }
165        }
166
167        this->addTeamPoints(0, (amountControlled * 30));
168        this->addTeamPoints(1, (amountControlled2 * 30));
169    }
170
171
172    // end game if one team reaches 2000 points
173    void TeamBaseMatch::endGame()
174    {
175        if (this->pointsTeam1_ >= 2000 || this->pointsTeam2_ >= 2000)
176        {
177            int winningteam = -1;
178
179            if (this->pointsTeam1_ > this->pointsTeam2_)
180            {
181                COUT(0) << "Team 1 has won the match" << std::endl;
182                winningteam = 0;
183            }
184            else
185            {
186                COUT(0) << "Team 2 has won the match" << std::endl;
187                winningteam = 1;
188            }
189
190            for (std::map<PlayerInfo*, int>::iterator it = this->teamnumbers_.begin(); it != this->teamnumbers_.end(); ++it)
191            {
192                if (it->first->getClientID() == CLIENTID_UNKNOWN)
193                    continue;
194
195                if (it->second == winningteam)
196                    this->gtinfo_->sendAnnounceMessage("You have won the match!", it->first->getClientID());
197                else
198                    this->gtinfo_->sendAnnounceMessage("You have lost the match!", it->first->getClientID());
199            }
200
201            this->end();
202            this->scoreTimer_.stopTimer();
203            this->outputTimer_.stopTimer();
204        }
205    }
206
207
208    // this function is called by the function winPoints() which adds points to the teams for every base and killed openents at a certain time
209    void TeamBaseMatch::addTeamPoints(int team, int points)
210    {
211        if(team == 0)
212        {
213            this->pointsTeam1_ += points;
214        }
215        if(team == 1)
216        {
217            this->pointsTeam2_ += points;
218        }
219
220        this->endGame();
221    }
222
223    int TeamBaseMatch::getTeamPoints(int team)
224    {
225        if(team == 0)
226        {
227            return this->pointsTeam1_;
228        }
229        if(team == 1)
230        {
231            return this->pointsTeam2_;
232        }
233
234        return 0;
235    }
236
237    int TeamBaseMatch::getTeamBases(int team)
238    {
239        int count = 0;
240
241        for (std::set<TeamBaseMatchBase*>::const_iterator it = this->bases_.begin(); it != this->bases_.end(); ++it)
242        {
243            if ((*it)->getState() == BaseState::ControlTeam1 && team == 0)
244                count++;
245            if ((*it)->getState() == BaseState::ControlTeam2 && team == 1)
246                count++;
247        }
248
249        return count;
250    }
251
252    void TeamBaseMatch::addBase(TeamBaseMatchBase* base)
253    {
254        this->bases_.insert(base);
255        base->setState(BaseState::Uncontrolled);
256    }
257
258    TeamBaseMatchBase* TeamBaseMatch::getBase(unsigned int index) const
259    {
260        unsigned int i = 0;
261        for (std::set<TeamBaseMatchBase*>::const_iterator it = this->bases_.begin(); it != this->bases_.end(); ++it)
262        {
263            i++;
264            if (i > index)
265                return (*it);
266        }
267        return 0;
268    }
269
270}
271
272
Note: See TracBrowser for help on using the repository browser.