Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

Last change on this file since 8858 was 8858, checked in by landauf, 13 years ago

merged output branch back to trunk.

Changes:

  • you have to include util/Output.h instead of util/Debug.h
  • COUT(x) is now called orxout(level)
  • output levels are now defined by an enum instead of numbers. see util/Output.h for the definition
  • it's possible to use output contexts with orxout(level, context). see util/Output.h for some common contexts. you can define more contexts
  • you must use 'endl' at the end of an output message, '\n' does not flush the message

Output levels:

  • instead of COUT(0) use orxout()
  • instead of COUT(1) use orxout(user_error) or orxout(internal_error)
  • instead of COUT(2) use orxout(user_warning) or orxout(internal_warning)
  • instead of COUT(3) use orxout(user_status/user_info) or orxout(internal_status/internal_info)
  • instead of COUT(4) use orxout(verbose)
  • instead of COUT(5) use orxout(verbose_more)
  • instead of COUT(6) use orxout(verbose_ultra)

Guidelines:

  • user_* levels are for the user, visible in the console and the log-file
  • internal_* levels are for developers, visible in the log-file
  • verbose_* levels are for debugging, only visible if the context of the output is activated

Usage in C++:

  • orxout() << "message" << endl;
  • orxout(level) << "message" << endl;
  • orxout(level, context) << "message" << endl;

Usage in Lua:

  • orxout("message")
  • orxout(orxonox.level.levelname, "message")
  • orxout(orxonox.level.levelname, "context", "message")

Usage in Tcl (and in the in-game-console):

  • orxout levelname message
  • orxout_context levelname context message
  • shortcuts: log message, error message, warning message, status message, info message, debug message
  • 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/command/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        orxout(message) << "Points standing:" << '\n' << "Team 1: "<< pointsTeam1_ << '\n' << "Team 2: " << pointsTeam2_ << endl;
144        if(pointsTeam1_ >=1700 && pointsTeam1_ < 2000) orxout(message) << "Team 1 is near victory!" << endl;
145        if(pointsTeam2_ >=1700 && pointsTeam2_ < 2000) orxout(message) << "Team 2 is near victory!" << 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                orxout(message) << "Team 1 has won the match" << endl;
182                winningteam = 0;
183            }
184            else
185            {
186                orxout(message) << "Team 2 has won the match" << 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() == NETWORK_PEER_ID_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.