From: <wrt...@us...> - 2008-02-05 14:43:56
|
Revision: 7738 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7738&view=rev Author: wrtlprnft Date: 2008-02-05 06:43:58 -0800 (Tue, 05 Feb 2008) Log Message: ----------- Made zonesv2 optional. It defaults to disabled, use --enable-zonesv2 to compile zonesv2 instead of the old zones code. I hope this is stable, but it survived a couple of test rounds in both modes for me. Modified Paths: -------------- armagetronad/trunk/armagetronad/configure.ac armagetronad/trunk/armagetronad/src/Makefile.am armagetronad/trunk/armagetronad/src/tron/cockpit/cMap.cpp armagetronad/trunk/armagetronad/src/tron/cockpit/cMap.h armagetronad/trunk/armagetronad/src/tron/gGame.cpp armagetronad/trunk/armagetronad/src/tron/gGame.h armagetronad/trunk/armagetronad/src/tron/gParser.cpp armagetronad/trunk/armagetronad/src/tron/gParser.h Added Paths: ----------- armagetronad/trunk/armagetronad/src/tron/gWinZone.cpp armagetronad/trunk/armagetronad/src/tron/gWinZone.h Modified: armagetronad/trunk/armagetronad/configure.ac =================================================================== --- armagetronad/trunk/armagetronad/configure.ac 2008-02-05 11:25:12 UTC (rev 7737) +++ armagetronad/trunk/armagetronad/configure.ac 2008-02-05 14:43:58 UTC (rev 7738) @@ -156,6 +156,11 @@ [enable server side code for the krawall style user authentication (default=disabled)]),, enable_armathentication=no) +AC_ARG_ENABLE(zonesv2, + AC_HELP_STRING([--enable-zonesv2], + [enable experimental zonesv2 code (default=disabled)]),, +enable_zonesv2=no) + AC_ARG_ENABLE(automakedefaults, AC_HELP_STRING([--enable-automakedefaults], [enforce the default installation directories as set by automake. localstatedir=prefix/var violates the FHS, so this is off by default.]),, @@ -265,6 +270,12 @@ AC_DEFINE(KRAWALL_SERVER,,enables krawall server) fi +if test x$enable_zonesv2 = xyes; then +AC_DEFINE(ENABLE_ZONESV2,,enables zonesv2) +fi + +AM_CONDITIONAL(BUILDZONESV2, test x$enable_zonesv2 = xyes) + dnl developer CXXFLAGS test -z "$DEBUGLEVEL" && DEBUGLEVEL=0 test -z "$CODELEVEL" && CODELEVEL=0 Modified: armagetronad/trunk/armagetronad/src/Makefile.am =================================================================== --- armagetronad/trunk/armagetronad/src/Makefile.am 2008-02-05 11:25:12 UTC (rev 7737) +++ armagetronad/trunk/armagetronad/src/Makefile.am 2008-02-05 14:43:58 UTC (rev 7738) @@ -138,15 +138,6 @@ tron/gSensor.cpp tron/gSensor.h tron/gServerBrowser.cpp tron/gServerBrowser.h tron/gSparks.cpp tron/gSparks.h\ tron/gSpawn.cpp tron/gSpawn.h tron/gStuff.cpp tron/gStuff.h tron/gTeam.cpp tron/gTeam.h tron/gWall.cpp\ tron/gWall.h\ - tron/zone/zZone.cpp tron/zone/zZone.h\ - tron/zone/zShape.cpp tron/zone/zShape.hpp\ - tron/zone/zMonitor.h tron/zone/zMonitor.cpp\ - tron/zone/zEffectGroup.cpp tron/zone/zEffectGroup.h\ - tron/zone/zMisc.h\ - tron/zone/zValidator.h tron/zone/zValidator.cpp\ - tron/zone/zSelector.h tron/zone/zSelector.cpp\ - tron/zone/zEffector.h tron/zone/zEffector.cpp\ - tron/zone/zZoneInfluence.h tron/zone/zZoneInfluence.cpp\ tron/gServerFavorites.h tron/gServerFavorites.cpp\ tron/gStatistics.h tron/gStatistics.cpp\ tron/gStatList.h tron/gStatList.cpp\ @@ -161,6 +152,22 @@ tron/cockpit/cRectangle.h tron/cockpit/cRectangle.cpp\ tron/gFriends.h tron/gFriends.cpp +if BUILDZONESV2 +libtron_a_SOURCES +=\ + tron/zone/zZone.cpp tron/zone/zZone.h\ + tron/zone/zShape.cpp tron/zone/zShape.hpp\ + tron/zone/zMonitor.h tron/zone/zMonitor.cpp\ + tron/zone/zEffectGroup.cpp tron/zone/zEffectGroup.h\ + tron/zone/zMisc.h\ + tron/zone/zValidator.h tron/zone/zValidator.cpp\ + tron/zone/zSelector.h tron/zone/zSelector.cpp\ + tron/zone/zEffector.h tron/zone/zEffector.cpp\ + tron/zone/zZoneInfluence.h tron/zone/zZoneInfluence.cpp +else +libtron_a_SOURCES +=\ + tron/gWinZone.h tron/gWinZone.cpp +endif + libui_a_SOURCES=ui/uInput.cpp ui/uInput.h ui/uInputQueue.cpp ui/uInputQueue.h ui/uMenu.cpp ui/uMenu.h endif Modified: armagetronad/trunk/armagetronad/src/tron/cockpit/cMap.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/cockpit/cMap.cpp 2008-02-05 11:25:12 UTC (rev 7737) +++ armagetronad/trunk/armagetronad/src/tron/cockpit/cMap.cpp 2008-02-05 14:43:58 UTC (rev 7738) @@ -33,7 +33,11 @@ #include "rRender.h" #include "rScreen.h" +#ifdef ENABLE_ZONESV2 #include "zone/zZone.h" +#else +#include "gWinZone.h" +#endif #include "eRectangle.h" #include "ePlayer.h" #include "eTimer.h" @@ -41,6 +45,7 @@ #include "rViewport.h" #include "eGrid.h" #include "eCamera.h" +#include "gCycle.h" #endif @@ -54,6 +59,9 @@ #ifndef DEDICATED +#ifndef ENABLE_ZONESV2 +typedef gZone zZone; +#endif extern std::deque<zZone *> sg_Zones; namespace cWidget { @@ -299,7 +307,11 @@ for(std::deque<zZone *>::const_iterator i = sg_Zones.begin(); i != sg_Zones.end(); ++i) { tASSERT(*i); tCoord const &position = (*i)->GetPosition(); +#ifdef ENABLE_ZONESV2 const float radius = (*i)->GetScale(); +#else + const float radius = (*i)->GetRadius(); +#endif dist2 = (position-pl_CurPos).Norm(); if (dist2<min_dist2) { min_dist2 = dist2; Modified: armagetronad/trunk/armagetronad/src/tron/cockpit/cMap.h =================================================================== --- armagetronad/trunk/armagetronad/src/tron/cockpit/cMap.h 2008-02-05 11:25:12 UTC (rev 7737) +++ armagetronad/trunk/armagetronad/src/tron/cockpit/cMap.h 2008-02-05 14:43:58 UTC (rev 7738) @@ -44,8 +44,6 @@ #include <deque> #include <vector> -class zZone; - namespace cWidget { //! Processes and renders a map of the grid Modified: armagetronad/trunk/armagetronad/src/tron/gGame.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gGame.cpp 2008-02-05 11:25:12 UTC (rev 7737) +++ armagetronad/trunk/armagetronad/src/tron/gGame.cpp 2008-02-05 14:43:58 UTC (rev 7738) @@ -64,7 +64,11 @@ #include "gAICharacter.h" #include "tDirectories.h" #include "gTeam.h" +#ifdef ENABLE_ZONESV2 #include "zone/zZone.h" +#else +#include "gWinZone.cpp" +#endif #include "eVoter.h" #include "tRecorder.h" #include "gStatistics.h" @@ -124,12 +128,14 @@ #define DEFAULT_MAP "Anonymous/polygon/regular/square-1.0.1.aamap.xml" static tString mapfile(DEFAULT_MAP); +#ifdef ENABLE_ZONESV2 // The following are only relevant in the case of zones from maps using version 1 static REAL sg_conquestRate = .5; static REAL sg_defendRate = .25; static tSettingItem< REAL > sg_conquestRateConf( "FORTRESS_CONQUEST_RATE", sg_conquestRate ); static tSettingItem< REAL > sg_defendRateConf( "FORTRESS_DEFEND_RATE", sg_defendRate ); +#endif /* static void sg_ParseMap ( gParser * aParser, tString map_file ); @@ -2688,7 +2694,9 @@ } just_connected=false; +#ifdef ENABLE_ZONESV2 init_second_pass_zones(grid, aParser); +#endif break; case GS_TRANSFER_OBJECTS: // con << "Transferring objects...\n"; @@ -3193,12 +3201,14 @@ THIS HAS SIMPLY BEEN DEACTIVATED. IT SHOULD BE REACTIVATED WITH THE NEW ZONE CODE ***************** ===================== ******************** + */ +#ifndef ENABLE_ZONESV2 // activate instant win zone if ( winZone.Supported() && !bool( winDeathZone_ ) && winner == 0 && time - lastdeath > sg_currentSettings->winZoneMinLastDeath && time > sg_currentSettings->winZoneMinRoundTime ) { winDeathZone_ = sg_CreateWinDeathZone( grid, Arena.GetRandomPos( sg_winZoneRandomness ) ); } - */ +#endif bool holdBackNextRound = false; @@ -4323,6 +4333,7 @@ } } +#ifdef ENABLE_ZONESV2 void oldFortressAutomaticAssignment(zZone *zone, zMonitorPtr monitor); void init_second_pass_zones(eGrid *grid, gParser *parser) @@ -4480,6 +4491,7 @@ */ } } +#endif static nCallbackLoginLogout lc(LoginCallback); Modified: armagetronad/trunk/armagetronad/src/tron/gGame.h =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gGame.h 2008-02-05 11:25:12 UTC (rev 7737) +++ armagetronad/trunk/armagetronad/src/tron/gGame.h 2008-02-05 14:43:58 UTC (rev 7738) @@ -50,7 +50,11 @@ typedef enum{gFINISH_EXPRESS,gFINISH_IMMEDIATELY,gFINISH_SPEEDUP,gFINISH_NORMAL} gFinishType; +#ifdef ENABLE_ZONESV2 class zZone; +#else +class gZone; +#endif //extern gFinishType sg_finishType; @@ -58,7 +62,11 @@ unsigned short state; // the gamestate we are currently in unsigned short stateNext; // if a state change has been requested +#ifdef ENABLE_ZONESV2 tJUST_CONTROLLED_PTR< zZone > winDeathZone_; // the win zone +#else + tJUST_CONTROLLED_PTR< gZone > winDeathZone_; // the win zone +#endif bool goon; Modified: armagetronad/trunk/armagetronad/src/tron/gParser.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gParser.cpp 2008-02-05 11:25:12 UTC (rev 7737) +++ armagetronad/trunk/armagetronad/src/tron/gParser.cpp 2008-02-05 14:43:58 UTC (rev 7738) @@ -27,8 +27,13 @@ #include "tConfiguration.h" #include "gGame.h" + +#ifdef ENABLE_ZONESV2 #include <boost/tokenizer.hpp> // to support splitting a string on "," #include <boost/shared_ptr.hpp> +#else +#include "gWinZone.h" +#endif #ifdef __MINGW32__ #define xmlFree(x) free(x) @@ -38,6 +43,7 @@ # include "tDirectories.h" #endif +#ifdef ENABLE_ZONESV2 typedef std::map< string, zMonitorPtr > monitorMap; monitorMap monitors; @@ -54,13 +60,12 @@ static tString polygonal_shape_used(DEFAULT_POLYGONAL_SHAPE_USED); static nSettingItemWatched<tString> safetymecanism_polygonal_shapeused("POLYGONAL_SHAPE_USED",polygonal_shape_used, nConfItemVersionWatcher::Group_Breaking, 20 ); -int mapVersion = 0; // The version of the map currently being parsed. Used to adapt parsing to support version specific features - // The following are only relevant in the case of zones from maps using version 1 static REAL sg_conquestDecayRate = .1; static tSettingItem< REAL > sg_conquestDecayRateConf( "FORTRESS_CONQUEST_DECAY_RATE", sg_conquestDecayRate ); +#endif +int mapVersion = 0; // The version of the map currently being parsed. Used to adapt parsing to support version specific features - //! Warn about deprecated map format static void sg_Deprecated() { @@ -139,6 +144,7 @@ return r; } +#ifdef ENABLE_ZONESV2 rColor gParser::myxmlGetPropColorFromHex(xmlNodePtr cur, const char *name) { char *v = myxmlGetProp(cur, name); @@ -164,6 +170,7 @@ xmlFree(v); return aColor; } +#endif float gParser::myxmlGetPropFloat(xmlNodePtr cur, const char *name) { @@ -183,6 +190,7 @@ return r; } +#ifdef ENABLE_ZONESV2 Triad gParser::myxmlGetPropTriad(xmlNodePtr cur, const char *name) { Triad res = _ignore; @@ -194,6 +202,7 @@ xmlFree(v); return res; } +#endif #define myxmlHasProp(cur, name) xmlHasProp(cur, reinterpret_cast<const xmlChar *>(name)) @@ -506,6 +515,7 @@ endElementAlternative(grid, cur, keyword); } +#ifdef ENABLE_ZONESV2 /* Extract all the color codes and build a rColor object. Return: a rColor object. @@ -595,9 +605,6 @@ return color; } - - - zShapePtr gParser::parseShapeCircleArthemis(eGrid *grid, xmlNodePtr cur, unsigned short idZone, const xmlChar * keyword) { @@ -1457,10 +1464,38 @@ } } } +#else +bool +gParser::parseShapeCircle(eGrid *grid, xmlNodePtr cur, float &x, float &y, float &radius, float& growth, const xmlChar * keyword) +{ + radius = myxmlGetPropFloat(cur, "radius"); + growth = myxmlGetPropFloat(cur, "growth"); + cur = cur->xmlChildrenNode; + while( cur != NULL) { + if (!xmlStrcmp(cur->name, (const xmlChar *)"text") || !xmlStrcmp(cur->name, (const xmlChar *)"comment")) {} + else if (isElement(cur->name, (const xmlChar *)"Point", keyword)) { + x = myxmlGetPropFloat(cur, "x"); + y = myxmlGetPropFloat(cur, "y"); + + endElementAlternative(grid, cur, keyword); + return true; + } + else if (isElement(cur->name, (const xmlChar *)"Alternative", keyword)) { + if (isValidAlternative(cur, keyword)) { + parseAlternativeContent(grid, cur); + } + } + cur = cur->next; + } + return false; +} +#endif + void gParser::parseZone(eGrid * grid, xmlNodePtr cur, const xmlChar * keyword) { +#ifdef ENABLE_ZONESV2 switch (mapVersion) { case 1: @@ -1473,8 +1508,50 @@ parseZoneBachus(grid, cur, keyword); break; } +#else + float x, y, radius, growth; + bool shapeFound = false; + xmlNodePtr shape = cur->xmlChildrenNode; + + while(shape != NULL && shapeFound==false) { + if (!xmlStrcmp(cur->name, (const xmlChar *)"text") || !xmlStrcmp(cur->name, (const xmlChar *)"comment")) {} + else if (isElement(shape->name, (const xmlChar *)"ShapeCircle", keyword)) { + shapeFound = parseShapeCircle(grid, shape, x, y, radius, growth, keyword); + } + else if (isElement(cur->name, (const xmlChar *)"Alternative", keyword)) { + if (isValidAlternative(cur, keyword)) { + parseAlternativeContent(grid, cur); + } + } + shape = shape->next; + } + + gZone * zone = NULL; + if (sn_GetNetState() != nCLIENT ) + { + if (!xmlStrcmp(xmlGetProp(cur, (const xmlChar *)"effect"), (const xmlChar *)"win")) { + zone = tNEW( gWinZoneHack) ( grid, eCoord(x*sizeMultiplier,y*sizeMultiplier) ); + } + else if (!xmlStrcmp(xmlGetProp(cur, (const xmlChar *)"effect"), (const xmlChar *)"death")) { + zone = tNEW( gDeathZoneHack) ( grid, eCoord(x*sizeMultiplier,y*sizeMultiplier) ); + } + else if (!xmlStrcmp(xmlGetProp(cur, (const xmlChar *)"effect"), (const xmlChar *)"fortress")) { + zone = tNEW( gBaseZoneHack) ( grid, eCoord(x*sizeMultiplier,y*sizeMultiplier) ); + } + + // leaving zone undeleted is no memory leak here, the gid takes control of it + if ( zone ) + { + zone->SetRadius( radius*sizeMultiplier ); + zone->SetExpansionSpeed( growth*sizeMultiplier ); + zone->SetRotationSpeed( .3f ); + zone->RequestSync(); + } + } +#endif } +#ifdef ENABLE_ZONESV2 void gParser::parseMonitor(eGrid * grid, xmlNodePtr cur, const xmlChar * keyword) { @@ -1562,6 +1639,7 @@ } } } +#endif ePoint * gParser::DrawRim( eGrid * grid, ePoint * start, eCoord const & stop, REAL h ) { @@ -1807,16 +1885,18 @@ else if (isElement(cur->name, (const xmlChar *)"Axes", keyword)) { parseAxes(grid, cur, keyword); } + else if (isElement(cur->name, (const xmlChar *)"Spawn", keyword)) { + parseSpawn(grid, cur, keyword); + } +#ifdef ENABLE_ZONESV2 // Introduced in version 2, but no extra logic is required for it. else if (isElement(cur->name, (const xmlChar *)"Ownership", keyword)) { parseOwnership(grid, cur, keyword); } - else if (isElement(cur->name, (const xmlChar *)"Spawn", keyword)) { - parseSpawn(grid, cur, keyword); - } else if (isElement(cur->name, (const xmlChar *)"Monitor", keyword)) { parseMonitor(grid, cur, keyword); } +#endif else if (isElement(cur->name, (const xmlChar *)"Zone", keyword)) { parseZone(grid, cur, keyword); } @@ -1841,6 +1921,7 @@ } } +#ifdef ENABLE_ZONESV2 /** * */ @@ -1943,6 +2024,7 @@ // TeamId is #REQUIRED, this should not happen } } +#endif void gParser::parseWorld(eGrid *grid, xmlNodePtr cur, const xmlChar * keyword) @@ -2047,7 +2129,9 @@ xmlNodePtr cur; cur = xmlDocGetRootElement(m_Doc); +#ifdef ENABLE_ZONESV2 monitors.clear(); +#endif #ifdef DEBUG_ZONE_SYNC newGameRound = true; #endif //DEBUG_ZONE_SYNC @@ -2101,14 +2185,18 @@ } } +#ifdef ENABLE_ZONESV2 mapZones.clear(); +#endif // fprintf(stderr,"ERROR: Map file is missing root \'Resources\' node"); } +#ifdef ENABLE_ZONESV2 zMonitorPtr gParser::getMonitor(string monitorName) { return monitors[monitorName]; } +#endif Modified: armagetronad/trunk/armagetronad/src/tron/gParser.h =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gParser.h 2008-02-05 11:25:12 UTC (rev 7737) +++ armagetronad/trunk/armagetronad/src/tron/gParser.h 2008-02-05 14:43:58 UTC (rev 7738) @@ -15,8 +15,10 @@ class gGame; class gWallRim; +#ifdef ENABLE_ZONESV2 #include "zone/zZone.h" #include "zone/zMisc.h" +#endif /* @@ -44,7 +46,9 @@ // gParser(const gGame *aGame, gArena *anArena, tControlledPTR<eGrid> aGrid); void setSizeMultiplier(REAL aSizeMultiplier); void Parse(); +#ifdef ENABLE_ZONESV2 zMonitorPtr getMonitor(string monitorName); +#endif protected: bool trueOrFalse(char *str); @@ -52,9 +56,11 @@ int myxmlGetPropInt(xmlNodePtr cur, const char *name); float myxmlGetPropFloat(xmlNodePtr cur, const char *name); bool myxmlGetPropBool(xmlNodePtr cur, const char *name); +#ifdef ENABLE_ZONESV2 Triad myxmlGetPropTriad(xmlNodePtr cur, const char *name); + rColor myxmlGetPropColorFromHex(xmlNodePtr cur, const char *name); +#endif void myxmlGetDirection(xmlNodePtr cur, float &x, float &y); - rColor myxmlGetPropColorFromHex(xmlNodePtr cur, const char *name); // bool isElement(const xmlChar *elementName, const xmlChar *searchedElement); bool isElement(const xmlChar *elementName, const xmlChar *searchedElement, const xmlChar * keyword = NULL); @@ -70,13 +76,15 @@ void parseAxes(eGrid *grid, xmlNodePtr cur, const xmlChar * keyword); void parseSpawn(eGrid *grid, xmlNodePtr cur, const xmlChar * keyword); void parseZone(eGrid *grid, xmlNodePtr cur, const xmlChar * keyword); +#ifdef ENABLE_ZONESV2 void parseZoneArthemis(eGrid * grid, xmlNodePtr cur, const xmlChar * keyword); void parseZoneBachus(eGrid * grid, xmlNodePtr cur, const xmlChar * keyword); + rColor parseColor(eGrid *grid, xmlNodePtr cur, const xmlChar * keyword); +#endif void parseWall(eGrid *grid, xmlNodePtr cur, const xmlChar * keyword); - rColor parseColor(eGrid *grid, xmlNodePtr cur, const xmlChar * keyword); - +#ifdef ENABLE_ZONESV2 zShapePtr parseShapeCircleArthemis(eGrid *grid, xmlNodePtr cur, short unsigned int idZone, const xmlChar * keyword); zShapePtr parseShapeCircleBachus(eGrid *grid, xmlNodePtr cur, short unsigned int idZone, const xmlChar * keyword); zShapePtr parseShapePolygon(eGrid *grid, xmlNodePtr cur, short unsigned int idZone, const xmlChar * keyword); @@ -90,11 +98,13 @@ zValidatorPtr parseZoneEffectGroupValidator(eGrid * grid, xmlNodePtr cur, const xmlChar * keyword); zZoneInfluencePtr parseZoneEffectGroupZone(eGrid * grid, xmlNodePtr cur, const xmlChar * keyword); - typedef std::map<string, std::set<string> > TeamOwnershipInfo; typedef std::map<string, std::set<string> >::value_type TeamOwnershipInfoType; void parseOwnership(eGrid *grid, xmlNodePtr cur, const xmlChar * keyword); void parseTeamOwnership(eGrid *grid, xmlNodePtr cur, const xmlChar * keyword, TeamOwnershipInfo & team); +#else + bool parseShapeCircle(eGrid *grid, xmlNodePtr cur, float &x, float &y, float &radius, float &growth, const xmlChar *keyword); +#endif void parseField(eGrid *grid, xmlNodePtr cur, const xmlChar * keyword); void parseWorld(eGrid *grid, xmlNodePtr cur, const xmlChar * keyword = NULL); void parseMap(eGrid *grid, xmlNodePtr cur, const xmlChar * keyword = NULL); @@ -108,16 +118,19 @@ void parseWallRect(eGrid *grid, xmlNodePtr cur, const xmlChar * keyword); void parseObstacleWall(eGrid *grid, xmlNodePtr cur, const xmlChar * keyword); +#ifdef ENABLE_ZONESV2 void myCheapParameterSplitter(const string &str, tFunction &tf, bool addSizeMultiplier=false); void myCheapParameterSplitter2(const string &str, tPolynomial<nMessage> &tp, bool addSizeMultiplier=false); +#endif /* This is a hack that will bring shame to my decendants for many generations: */ float sizeMultiplier; +#ifdef ENABLE_ZONESV2 int currentFormat; // Store the format version of the map currently being parsed. Used to support different format. public: tValue::Expr::varmap_t vars; tValue::Expr::funcmap_t functions; - +#endif }; #endif //ArmageTron_PARSER_H Added: armagetronad/trunk/armagetronad/src/tron/gWinZone.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gWinZone.cpp (rev 0) +++ armagetronad/trunk/armagetronad/src/tron/gWinZone.cpp 2008-02-05 14:43:58 UTC (rev 7738) @@ -0,0 +1,1655 @@ +/* + +************************************************************************* + +ArmageTron -- Just another Tron Lightcycle Game in 3D. +Copyright (C) 2000 Manuel Moos (ma...@mo...) + +************************************************************************** + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*************************************************************************** + +*/ + +#include "rSDL.h" + +#include "gWinZone.h" +#include "eFloor.h" +#include "eTimer.h" +#include "eGrid.h" +#include "gCycle.h" +#include "gGame.h" +#include "eTeam.h" +#include "ePlayer.h" +#include "rRender.h" +#include "nConfig.h" +#include "tString.h" +#include "rScreen.h" +#include "eSoundMixer.h" + +#include <time.h> +#include <algorithm> +#include <functional> +#include <deque> + +std::deque<gZone *> sg_Zones; + +static int sg_zoneDeath = 1; +static tSettingItem<int> sg_zoneDeathConf( "WIN_ZONE_DEATHS", sg_zoneDeath ); + +static REAL sg_expansionSpeed = 1.0f; +static REAL sg_initialSize = 5.0f; + +static nSettingItem< REAL > sg_expansionSpeedConf( "WIN_ZONE_EXPANSION", sg_expansionSpeed ); +static nSettingItem< REAL > sg_initialSizeConf( "WIN_ZONE_INITIAL_SIZE", sg_initialSize ); + +//! creates a win or death zone (according to configuration) at the specified position +gZone * sg_CreateWinDeathZone( eGrid * grid, const eCoord & pos ) +{ + gZone * ret = NULL; + if ( sg_zoneDeath ) + { + ret = tNEW( gDeathZoneHack( grid, pos ) ); + sn_ConsoleOut( "$instant_death_activated" ); + } + else + { + ret = tNEW( gWinZoneHack( grid, pos ) ); + sn_ConsoleOut( "$instant_win_activated" ); + } + + // initialize radius and expansion speed + static_cast<eGameObject*>(ret)->Timestep( se_GameTime() ); + ret->SetReferenceTime(); + ret->SetRadius( sg_initialSize ); + ret->SetExpansionSpeed( sg_expansionSpeed ); + ret->SetRotationSpeed( .3f ); + + return ret; +} + +// number of segments to render a zone with +static const int sg_segments = 11; + +// ******************************************************************************* +// * +// * EvaluateFunctionNow +// * +// ******************************************************************************* +//! +//! @param f function to evaluate +//! @return the function's value at lastTime - referenceTime_ +//! +// ******************************************************************************* + +inline REAL gZone::EvaluateFunctionNow( tFunction const & f ) const +{ + return f( lastTime - referenceTime_ ); +} + +// ******************************************************************************* +// * +// * SetFunctionNow +// * +// ******************************************************************************* +//! +//! @param f function to modify +//! @param value value the function should have at lastTime - referenceTime_ +//! +// ******************************************************************************* + +inline void gZone::SetFunctionNow( tFunction & f, REAL value ) const +{ + f.SetOffset( value + f.GetSlope() * ( referenceTime_ - lastTime ) ); +} + +// ******************************************************************************* +// * +// * gZone +// * +// ******************************************************************************* +//! +//! @param grid Grid to put the zone into +//! @param pos Position to spawn the zone at +//! +// ******************************************************************************* + +gZone::gZone( eGrid * grid, const eCoord & pos ) + :eNetGameObject( grid, pos, eCoord( 0,0 ), NULL, true ), rotation_(1,0) +{ + // store creation time + referenceTime_ = createTime_ = lastTime = 0; + + // add to game grid + this->AddToList(); + + sg_Zones.push_back(this); + + // initialize position functions + SetPosition( pos ); + eSoundMixer* mixer = eSoundMixer::GetMixer(); + mixer->PushButton(ZONE_SPAWN, pos); +} + +// ******************************************************************************* +// * +// * gZone +// * +// ******************************************************************************* +//! +//! @param m Message to read creation data from +//! +// ******************************************************************************* + +gZone::gZone( nMessage & m ) + :eNetGameObject( m ), rotation_(1,0) +{ + // read creation time + m >> createTime_; + referenceTime_ = lastTime = createTime_; + + // initialize color to white, ReadSync will fill in the true value if available + color_.r_ = color_.g_ = color_.b_ = 1.0f; + + // add to game grid + this->AddToList(); + + sg_Zones.push_back(this); + + // initialize position functions + SetPosition( pos ); + eSoundMixer* mixer = eSoundMixer::GetMixer(); + mixer->PushButton(ZONE_SPAWN, pos); +} + +// ******************************************************************************* +// * +// * ~gZone +// * +// ******************************************************************************* +//! +//! +// ******************************************************************************* + +gZone::~gZone( void ) +{ + sg_Zones.erase( + std::find_if( + sg_Zones.begin(), + sg_Zones.end(), + std::bind2nd( + std::equal_to<gZone *>(), + this) + ) + ); +} + +// ******************************************************************************* +// * +// * WriteCreate +// * +// ******************************************************************************* +//! +//! @param m Message to write creation data to +//! +// ******************************************************************************* + +void gZone::WriteCreate( nMessage & m ) +{ + // delegate + eNetGameObject::WriteCreate( m ); + + m << createTime_; +} + +// ******************************************************************************* +// * +// * WriteSync +// * +// ******************************************************************************* +//! +//! @param m Message to write sync data to +//! +// ******************************************************************************* + +void gZone::WriteSync( nMessage & m ) +{ + // delegate + eNetGameObject::WriteSync( m ); + + // write color + m << color_.r_; + m << color_.g_; + m << color_.b_; + + // write reference time and functions + m << referenceTime_; + m << posx_; + m << posy_; + m << radius_; + + // write rotation speed + m << rotationSpeed_; +} + +// ******************************************************************************* +// * +// * ReadSync +// * +// ******************************************************************************* +//! +//! @param m Message to read sync data from +//! +// ******************************************************************************* + +void gZone::ReadSync( nMessage & m ) +{ + // delegage + eNetGameObject::ReadSync( m ); + + // read color + if (!m.End()) + { + m >> color_.r_; + m >> color_.g_; + m >> color_.b_; + se_MakeColorValid(color_.r_, color_.g_, color_.b_, 1.0f); + } + + // read reference time and functions + if (!m.End()) + { + m >> referenceTime_; + m >> posx_; + m >> posy_; + m >> radius_; + } + else + { + referenceTime_ = createTime_; + + // take old default values + this->radius_.SetOffset( sg_initialSize ); + this->radius_.SetSlope( sg_expansionSpeed ); + SetPosition( pos ); + SetVelocity( eCoord() ); + } + + // read rotation speed + if (!m.End()) + { + m >> rotationSpeed_; + } + else + { + // set fixed values + SetRotationSpeed( .3f ); + SetRotationAcceleration( 0.0f ); + } +} + +// ******************************************************************************* +// * +// * Timestep +// * +// ******************************************************************************* +//! +//! @param time the current time +//! +// ******************************************************************************* + +bool gZone::Timestep( REAL time ) +{ + // rotate + REAL speed = GetRotationSpeed(); + REAL angle = ( time - lastTime ) * speed; + // angle /= ( 1 + 2 * 3.14159 * angle/sg_segments ); + rotation_ = rotation_.Turn( cos( angle ), sin( angle ) ); + + // move to new position + REAL dt = time - referenceTime_; + Move( eCoord( posx_( dt ), posy_( dt ) ), lastTime, time ); + + // update time + lastTime = time; + + // kill this zone if it shrunk down to zero radius + if ( GetExpansionSpeed() < 0 && GetRadius() <= 0 ) + { + OnVanish(); + return true; + } + + return false; +} + +// ******************************************************************************* +// * +// * OnVanish +// * +// ******************************************************************************* +//! +//! +// ******************************************************************************* + +void gZone::OnVanish( void ) +{ +} + +// ******************************************************************************* +// * +// * InteractWith +// * +// ******************************************************************************* +//! +//! @param target the other game object +//! @param time the current time +//! @param recursion if set to true, don't recurse into other InteractWith functions (quite silly now that I think about it...) +//! +// ******************************************************************************* + +void gZone::InteractWith( eGameObject * target, REAL time, int recursion ) +{ + gCycle* prey = dynamic_cast< gCycle* >( target ); + if ( prey ) + { + REAL r = this->Radius(); + if ( ( prey->Position() - this->Position() ).NormSquared() < r*r ) + { + if ( prey->Player() && prey->Alive() ) + { + OnEnter( prey, time ); + } + } + } +} + +// ******************************************************************************* +// * +// * OnEnter +// * +// ******************************************************************************* +//! +//! @param target the cycle that has been found inside the zone +//! @param time the current time +//! +// ******************************************************************************* + +void gZone::OnEnter( gCycle * target, REAL time ) +{ +} + +// the zone's network initializator +static nNOInitialisator<gZone> zone_init(340,"zone"); + +// ******************************************************************************* +// * +// * CreatorDescriptor +// * +// ******************************************************************************* +//! +//! @return +//! +// ******************************************************************************* + +nDescriptor & gZone::CreatorDescriptor( void ) const +{ + return zone_init; +} + +// ******************************************************************************* +// * +// * Radius +// * +// ******************************************************************************* +//! +//! @return +//! +// ******************************************************************************* + +REAL gZone::Radius( void ) const +{ + return GetRadius(); +} + +// ******************************************************************************* +// * +// * Render +// * +// ******************************************************************************* +//! +//! @param cam the camera used for rendering +//! +// ******************************************************************************* + +void gZone::Render( const eCamera * cam ) +{ +#ifndef DEDICATED + + color_.a_ = ( lastTime - createTime_ ) * .2f; + if ( color_.a_ > .7f ) + color_.a_ = .7f; + if ( color_.a_ <= 0 ) + return; + + GLfloat m[4][4]={{rotation_.x,rotation_.y,0,0}, + {-rotation_.y,rotation_.x,0,0}, + {0,0,1,0}, + {pos.x,pos.y,0,1}}; + + ModelMatrix(); + glPushMatrix(); + + glDisable(GL_LIGHT0); + glDisable(GL_LIGHT1); + glDisable(GL_LIGHTING); + glDisable(GL_CULL_FACE); + glDepthMask(GL_FALSE); + glBlendFunc( GL_SRC_ALPHA, GL_ONE ); + + //glDisable(GL_TEXTURE); + glDisable(GL_TEXTURE_2D); + + // glTranslatef(pos.x,pos.y,0); + + glMultMatrixf(&m[0][0]); + // glScalef(.5,.5,.5); + + if ( sr_alphaBlend ) + BeginQuads(); + else + BeginLineStrip(); + + const REAL seglen = .2f; + const REAL bot = 0.0f; + const REAL top = 5.0f; // + ( lastTime - createTime_ ) * .1f; + + color_.Apply(); + + REAL r = Radius(); + for ( int i = sg_segments - 1; i>=0; --i ) + { + REAL a = i * 2 * 3.14159 / REAL( sg_segments ); + REAL b = a + seglen; + + REAL sa = r * sin(a); + REAL ca = r * cos(a); + REAL sb = r * sin(b); + REAL cb = r * cos(b); + + glVertex3f(sa, ca, bot); + glVertex3f(sa, ca, top); + glVertex3f(sb, cb, top); + glVertex3f(sb, cb, bot); + + if ( !sr_alphaBlend ) + { + glVertex3f(sa, ca, bot); + RenderEnd(); + BeginLineStrip(); + } + } + + RenderEnd(); + + glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); + glDepthMask(GL_TRUE); + + glPopMatrix(); +#endif +} + +void gZone::Render2D(tCoord) const { +#ifndef DEDICATED + if ( color_.a_ <= 0 ) + return; + + GLfloat m[4][4]={{rotation_.x,rotation_.y,0,0}, + {-rotation_.y,rotation_.x,0,0}, + {0,0,1,0}, + {pos.x,pos.y,0,1}}; + + ModelMatrix(); + glPushMatrix(); + + glMultMatrixf(&m[0][0]); + // glScalef(.5,.5,.5); + + BeginLines(); + + const REAL seglen = .2f; + + color_.Apply(); + + REAL r = Radius(); + for ( int i = sg_segments - 1; i>=0; --i ) + { + REAL a = i * 2 * 3.14159 / REAL( sg_segments ); + REAL b = a + seglen; + + REAL sa = r * sin(a); + REAL ca = r * cos(a); + REAL sb = r * sin(b); + REAL cb = r * cos(b); + + glVertex2f(sa, ca); + glVertex2f(sb, cb); + } + + RenderEnd(); + + glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); + glDepthMask(GL_TRUE); + + glPopMatrix(); +#endif +} + +// ******************************************************************************* +// * +// * gWinZoneHack +// * +// ******************************************************************************* +//! +//! @param grid Grid to put the zone into +//! @param pos Position to spawn the zone at +//! +// ******************************************************************************* + +gWinZoneHack::gWinZoneHack( eGrid * grid, const eCoord & pos ) + :gZone( grid, pos ) +{ + color_.r_ = 0.0f; + color_.g_ = 1.0f; + color_.b_ = 0.0f; +} + +// ******************************************************************************* +// * +// * gWinZoneHack +// * +// ******************************************************************************* +//! +//! @param m Message to read creation data from +//! @param null +//! +// ******************************************************************************* + +gWinZoneHack::gWinZoneHack( nMessage & m ) + : gZone( m ) +{ +} + +// ******************************************************************************* +// * +// * ~gWinZoneHack +// * +// ******************************************************************************* +//! +//! +// ******************************************************************************* + +gWinZoneHack::~gWinZoneHack( void ) +{ +} + +// ******************************************************************************* +// * +// * OnEnter +// * +// ******************************************************************************* +//! +//! @param target the cycle that has been found inside the zone +//! @param time the current time +//! +// ******************************************************************************* + +void gWinZoneHack::OnEnter( gCycle * target, REAL time ) +{ + static const char* message="$player_win_instant"; + sg_DeclareWinner( target->Player()->CurrentTeam(), message ); + + // let zone vanish + if ( GetExpansionSpeed() >= 0 ) + { + SetReferenceTime(); + SetExpansionSpeed( -GetRadius()*.5 ); + RequestSync(); + } +} + +// ******************************************************************************* +// * +// * gDeathZoneHack +// * +// ******************************************************************************* +//! +//! @param grid Grid to put the zone into +//! @param pos Position to spawn the zone at +//! +// ******************************************************************************* + +gDeathZoneHack::gDeathZoneHack( eGrid * grid, const eCoord & pos ) + :gZone( grid, pos ) +{ + color_.r_ = 1.0f; + color_.g_ = 0.0f; + color_.b_ = 0.0f; +} + +// ******************************************************************************* +// * +// * gDeathZoneHack +// * +// ******************************************************************************* +//! +//! @param m Message to read creation data from +//! @param null +//! +// ******************************************************************************* + +gDeathZoneHack::gDeathZoneHack( nMessage & m ) + : gZone( m ) +{ +} + +// ******************************************************************************* +// * +// * ~gDeathZoneHack +// * +// ******************************************************************************* +//! +//! +// ******************************************************************************* + +gDeathZoneHack::~gDeathZoneHack( void ) +{ +} + +static int score_deathzone=-1; +static tSettingItem<int> s_dz("SCORE_DEATHZONE",score_deathzone); + +// ******************************************************************************* +// * +// * OnEnter +// * +// ******************************************************************************* +//! +//! @param target the cycle that has been found inside the zone +//! @param time the current time +//! +// ******************************************************************************* + +void gDeathZoneHack::OnEnter( gCycle * target, REAL time ) +{ + target->Player()->AddScore(score_deathzone, tOutput(), "$player_lose_suicide"); + target->Kill(); +} + +// ******************************************************************************* +// * +// * gBaseZoneHack +// * +// ******************************************************************************* +//! +//! @param grid Grid to put the zone into +//! @param pos Position to spawn the zone at +//! +// ******************************************************************************* + +gBaseZoneHack::gBaseZoneHack( eGrid * grid, const eCoord & pos ) + :gZone( grid, pos), onlySurvivor_( false ), currentState_( State_Safe ) +{ + enemiesInside_ = ownersInside_ = 0; + conquered_ = 0; + lastSync_ = -10; + teamDistance_ = 0; + lastEnemyContact_ = se_GameTime(); +} + +// ******************************************************************************* +// * +// * gBaseZoneHack +// * +// ******************************************************************************* +//! +//! @param m Message to read creation data from +//! +// ******************************************************************************* + +gBaseZoneHack::gBaseZoneHack( nMessage & m ) + : gZone( m ), onlySurvivor_( false ), currentState_( State_Safe ) +{ + enemiesInside_ = ownersInside_ = 0; + conquered_ = 0; + lastSync_ = -10; + teamDistance_ = 0; + lastEnemyContact_ = se_GameTime(); +} + +// ******************************************************************************* +// * +// * ~gBaseZoneHack +// * +// ******************************************************************************* +//! +//! +// ******************************************************************************* + +gBaseZoneHack::~gBaseZoneHack( void ) +{ +} + +static REAL sg_conquestRate = .5; +static REAL sg_defendRate = .25; +static REAL sg_conquestDecayRate = .1; + +static tSettingItem< REAL > sg_conquestRateConf( "FORTRESS_CONQUEST_RATE", sg_conquestRate ); +static tSettingItem< REAL > sg_defendRateConf( "FORTRESS_DEFEND_RATE", sg_defendRate ); +static tSettingItem< REAL > sg_conquestDecayRateConf( "FORTRESS_CONQUEST_DECAY_RATE", sg_conquestDecayRate ); + +// time with no enemy inside a zone before it collapses harmlessly +static REAL sg_conquestTimeout = 0; +static tSettingItem< REAL > sg_conquestTimeoutConf( "FORTRESS_CONQUEST_TIMEOUT", sg_conquestTimeout ); + +// kill at least than many players from the team that just got its zone conquered +static int sg_onConquestKillMin = 0; +static tSettingItem< int > sg_onConquestKillMinConfig( "FORTRESS_CONQUERED_KILL_MIN", sg_onConquestKillMin ); + +// and at least this ratio +static REAL sg_onConquestKillRatio = 0; +static tSettingItem< REAL > sg_onConquestKillRationConfig( "FORTRESS_CONQUERED_KILL_RATIO", sg_onConquestKillRatio ); + +// score you get for conquering a zone +static int sg_onConquestScore = 0; +static tSettingItem< int > sg_onConquestConquestScoreConfig( "FORTRESS_CONQUERED_SCORE", sg_onConquestScore ); + +// flag indicating whether the team conquering the first zone wins (good for one on one matches) +static int sg_onConquestWin = 1; +static tSettingItem< int > sg_onConquestConquestWinConfig( "FORTRESS_CONQUERED_WIN", sg_onConquestWin ); + +// maximal number of base zones ownable by a team +static int sg_baseZonesPerTeam = 0; +static tSettingItem< int > sg_baseZonesPerTeamConfig( "FORTRESS_MAX_PER_TEAM", sg_baseZonesPerTeam ); + +// count zones belonging to the given team. +// fill in count and the zone that is farthest to the team. +void gBaseZoneHack::CountZonesOfTeam( eGrid const * grid, eTeam * otherTeam, int & count, gBaseZoneHack * & farthest ) +{ + count = 0; + farthest = NULL; + + // check whether other zones are already registered to that team + const tList<eGameObject>& gameObjects = grid->GameObjects(); + for (int j=gameObjects.Len()-1;j>=0;j--) + { + gBaseZoneHack *otherZone=dynamic_cast<gBaseZoneHack *>(gameObjects(j)); + + if ( otherZone && otherTeam == otherZone->Team() ) + { + count++; + if ( !farthest || otherZone->teamDistance_ > farthest->teamDistance_ ) + farthest = otherZone; + } + } +} + + +// ******************************************************************************* +// * +// * Timestep +// * +// ******************************************************************************* +//! +//! @param time the current time +//! +// ******************************************************************************* + +bool gBaseZoneHack::Timestep( REAL time ) +{ + if ( currentState_ == State_Conquering ) + { + // let zone vanish + SetReferenceTime(); + SetExpansionSpeed( -GetRadius()*.5 ); + SetRotationAcceleration( -GetRotationSpeed()*.4 ); + RequestSync(); + + currentState_ = State_Conquered; + } + + REAL dt = time - lastTime; + + // conquest going on + REAL conquest = sg_conquestRate * enemiesInside_ - sg_defendRate * ownersInside_ - sg_conquestDecayRate; + conquered_ += dt * conquest; + + // clamp + if ( conquered_ < 0 ) + { + conquered_ = 0; + conquest = 0; + } + if ( conquered_ > 1.01 ) + { + conquered_ = 1.01; + conquest = 0; + } + + // set speed according to conquest status + if ( currentState_ == State_Safe ) + { + REAL maxSpeed = 10 * ( 2 * 3.141 ) / sg_segments; + REAL omega = .3 + conquered_ * conquered_ * maxSpeed; + REAL omegaDot = 2 * conquered_ * conquest * maxSpeed; + + // determine the time since the last sync (exaggerate for smoother motion in local games) + REAL timeStep = lastTime - lastSync_; + if ( sn_GetNetState() != nSERVER ) + timeStep *= 100; + + if ( sn_GetNetState() != nCLIENT && + ( ( fabs( omega - GetRotationSpeed() ) + fabs( omegaDot - GetRotationAcceleration() ) ) * timeStep > .5 ) ) + { + SetRotationSpeed( omega ); + SetRotationAcceleration( omegaDot ); + SetReferenceTime(); + RequestSync(); + lastSync_ = lastTime; + } + + + // check for enemy contact timeout + if ( sg_conquestTimeout > 0 && lastEnemyContact_ + sg_conquestTimeout < time ) + { + enemies_.clear(); + + // if the zone would collapse without defenders, let it collapse now. A smart defender would + // have left the zone to let it collapse anyway. + if ( sg_conquestDecayRate < 0 ) + { + if ( team ) + sn_ConsoleOut( tOutput( "$zone_collapse_harmless", team->Name() ) ); + conquered_ = 1.0; + } + } + + // check whether the zone got conquered + if ( conquered_ >= 1 ) + { + currentState_ = State_Conquering; + OnConquest(); + } + } + + + // reset counts + enemiesInside_ = ownersInside_ = 0; + + // determine the owning team: the one that has a player spawned closest + + // find the closest player + if ( !team ) + { + teamDistance_ = 0; + const tList<eGameObject>& gameObjects = Grid()->GameObjects(); + gCycle * closest = NULL; + REAL closestDistance = 0; + for (int i=gameObjects.Len()-1;i>=0;i--) + { + gCycle *other=dynamic_cast<gCycle *>(gameObjects(i)); + + if (other ) + { + eTeam * otherTeam = other->Player()->CurrentTeam(); + eCoord otherpos = other->Position() - pos; + REAL distance = otherpos.NormSquared(); + if ( !closest || distance < closestDistance ) + { + // check whether other zones are already registered to that team + gBaseZoneHack * farthest = NULL; + int count = 0; + if ( sg_baseZonesPerTeam > 0 ) + CountZonesOfTeam( Grid(), otherTeam, count, farthest ); + + // only set team if not too many closer other zones are registered + if ( sg_baseZonesPerTeam == 0 || count < sg_baseZonesPerTeam || farthest->teamDistance_ > distance ) + { + closest = other; + closestDistance = distance; + } + } + } + } + + if ( closest ) + { + // take over team and color + team = closest->Player()->CurrentTeam(); + color_.r_ = team->R()/15.0; + color_.g_ = team->G()/15.0; + color_.b_ = team->B()/15.0; + teamDistance_ = closestDistance; + + RequestSync(); + } + + // if this zone does not belong to a team, discard it. + if ( !team ) + { + return true; + } + + // check other zones owned by the same team. Discard the one farthest away + // if the max count is exceeded + if ( team && sg_baseZonesPerTeam > 0 ) + { + gBaseZoneHack * farthest = 0; + int count = 0; + CountZonesOfTeam( Grid(), team, count, farthest ); + + // discard team of farthest zone + if ( count > sg_baseZonesPerTeam ) + farthest->team = NULL; + } + } + + + // delegate + bool ret = gZone::Timestep( time ); + + // reward survival + if ( !ret && onlySurvivor_ ) + { + const char* message= ( eTeam::teams.Len() > 2 || sg_onConquestScore ) ? "$player_win_survive" : "$player_win_conquest"; + sg_DeclareWinner( team, message ); + } + + return ret; +} + +// ******************************************************************************* +// * +// * OnVanish +// * +// ******************************************************************************* +//! +//! +// ******************************************************************************* + +void gBaseZoneHack::OnVanish( void ) +{ + if (!team) + return; + + CheckSurvivor(); + + // kill the closest owners of the zone + if ( currentState_ != State_Safe && ( enemies_.size() > 0 || sg_defendRate < 0 ) ) + { + int kills = int( sg_onConquestKillRatio * team->NumPlayers() ); + kills = kills > sg_onConquestKillMin ? kills : sg_onConquestKillMin; + + while ( kills > 0 ) + { + -- kills; + + ePlayerNetID * closest = NULL; + REAL closestDistance = 0; + + // find the closest living owner + for ( int i = team->NumPlayers()-1; i >= 0; --i ) + { + ePlayerNetID * player = team->Player(i); + eNetGameObject * object = player->Object(); + if ( object && object->Alive() ) + { + eCoord otherpos = object->Position() - pos; + REAL distance = otherpos.NormSquared(); + if ( !closest || distance < closestDistance ) + { + closest = player; + closestDistance = distance; + } + } + } + + if ( closest ) + { + sn_ConsoleOut( tOutput("$player_kill_collapse", closest->GetName() ) ); + closest->Object()->Kill(); + } + } + } +} + +// ******************************************************************************* +// * +// * OnConquest +// * +// ******************************************************************************* +//! +//! +// ******************************************************************************* + +void gBaseZoneHack::OnConquest( void ) +{ + // calculate score. If nobody really was inside the zone any more, half it. + int totalScore = sg_onConquestScore; + if ( 0 == enemiesInside_ ) + totalScore /= 2; + + // eliminate dead enemies + TeamArray enemiesAlive; + for ( TeamArray::iterator iter = enemies_.begin(); iter != enemies_.end(); ++iter ) + { + eTeam* team = *iter; + if ( team->Alive() ) + enemiesAlive.push_back( team ); + } + enemies_ = enemiesAlive; + + // add score for successful conquest, divided equally between the teams that are + // inside the zone + if ( totalScore && enemies_.size() > 0 ) + { + tOutput win; + if ( team ) + { + win.SetTemplateParameter( 3, team->Name() ); + win << "$player_win_conquest_specific"; + } + else + { + win << "$player_win_conquest"; + } + + int score = totalScore / enemies_.size(); + for ( TeamArray::iterator iter = enemies_.begin(); iter != enemies_.end(); ++iter ) + { + (*iter)->AddScore( score, win, tOutput() ); + } + } + + // trigger immediate win + if ( sg_onConquestWin && enemies_.size() > 0 ) + { + static const char* message="$player_win_conquest"; + sg_DeclareWinner( enemies_[0], message ); + } + + CheckSurvivor(); +} + +// if this flag is enabled, the last team with a non-conquered zone wins the round. +static int sg_onSurviveWin = 1; +static tSettingItem< int > sg_onSurviveWinConfig( "FORTRESS_SURVIVE_WIN", sg_onSurviveWin ); + +// ******************************************************************************* +// * +// * CheckSurvivor +// * +// ******************************************************************************* +//! +//! +// ******************************************************************************* + +void gBaseZoneHack::CheckSurvivor( void ) +{ + // test if there is only one team with non-conquered zones left + if ( sg_onSurviveWin ) + { + // find surviving team and test whether it is the only one + gBaseZoneHack * survivor = 0; + bool onlySurvivor = true; + + const tList<eGameObject>& gameObjects = Grid()->GameObjects(); + for (int i=gameObjects.Len()-1;i>=0 && onlySurvivor;i--){ + gBaseZoneHack *other=dynamic_cast<gBaseZoneHack *>(gameObjects(i)); + + if ( other && other->currentState_ == State_Safe && other->team ) + { + if ( survivor && survivor->team != other->team ) + onlySurvivor = false; + else + survivor = other; + } + } + + // reward it later + if ( onlySurvivor && survivor ) + { + survivor->onlySurvivor_ = true; + } + } +} + +// ******************************************************************************* +// * +// * OnEnter +// * +// ******************************************************************************* +//! +//! @param target the cycle that has been found inside the zone +//! @param time the current time +//! +// ******************************************************************************* + +void gBaseZoneHack::OnEnter( gCycle * target, REAL time ) +{ + // determine the team of the player + tASSERT( target ); + if ( !target->Player() ) + return; + tJUST_CONTROLLED_PTR< eTeam > otherTeam = target->Player()->CurrentTeam(); + if (!otherTeam) + return; + if ( currentState_ != State_Safe ) + return; + + // remember who is inside + if ( team == otherTeam ) + { + ++ ownersInside_; + } + else if ( team ) + { + if ( enemiesInside_ == 0 ) + enemies_.clear(); + + ++ enemiesInside_; + if ( std::find( enemies_.begin(), enemies_.end(), otherTeam ) == enemies_.end() ) + enemies_.push_back( otherTeam ); + + lastEnemyContact_ = time; + } +} + +// ******************************************************************************* +// * +// * tFunction +// * +// ******************************************************************************* +//! +//! +// ******************************************************************************* + +tFunction::tFunction( void ) + : offset_(0), slope_(0) +{ +} + +// ******************************************************************************* +// * +// * ~tFunction +// * +// ******************************************************************************* +//! +//! +// ******************************************************************************* + +tFunction::~tFunction( void ) +{ +} + +// ******************************************************************************* +// * +// * Evaluate +// * +// ******************************************************************************* +//! +//! @param argument +//! @return +//! +// ******************************************************************************* + +REAL tFunction::Evaluate( REAL argument ) const +{ + return offset_ + slope_ * argument; +} + +// ******************************************************************************* +// * +// * operator << +// * +// ******************************************************************************* +//! +//! @param m message to write to +//! @param f function to write +//! @return reference to message for chaining +//! +// ******************************************************************************* + +nMessage & operator << ( nMessage & m, tFunction const & f ) +{ + // write ID for compatibility with future extensions + unsigned short ID = 1; + m.Write( ID ); + + // write values + m << f.GetOffset(); + m << f.GetSlope(); + + return m; +} + +// ******************************************************************************* +// * +// * operator >> +// * +// ******************************************************************************* +//! +//! @param m message to read from +//! @param f function to read to +//! @return reference to message for chaining +//! +// ******************************************************************************* + +nMessage & operator >> ( nMessage & m, tFunction & f ) +{ + // write ID for compatibility with future extensions + unsigned short ID; + m.Read(ID); + tASSERT( ID == 1 ); + + // read values + REAL slope, offset; + m >> offset >> slope; + + // store values + f.SetOffset( offset ).SetSlope( slope ); + + return m; +} + +// ******************************************************************************* +// * +// * GetPosition +// * +// ******************************************************************************* +//! +//! @return the current position +//! +// ******************************************************************************* + +eCoord gZone::GetPosition( void ) const +{ + eCoord ret; + GetPosition( ret ); + return ret; +} + +// ******************************************************************************* +// * +// * GetPosition +// * +// ******************************************************************************* +//! +//! @param position the current position to fill +//! @return A reference to this to allow chaining +//! +// ******************************************************************************* + +gZone const & gZone::GetPosition( eCoord & position ) const +{ + position.x = EvaluateFunctionNow( posx_ ); + position.y = EvaluateFunctionNow( posy_ ); + return *this; +} + +// ******************************************************************************* +// * +// * SetPosition +// * +// ******************************************************************************* +//! +//! @param position the current position to set +//! @return A reference to this to allow chaining +//! +// ******************************************************************************* + +gZone & gZone::SetPosition( eCoord const & position ) +{ + SetFunctionNow( posx_, position.x ); + SetFunctionNow( posy_, position.y ); + return *this; +} + +// ******************************************************************************* +// * +// * GetVelocity +// * +// ******************************************************************************* +//! +//! @return the current velocity +//! +// **********************************************************************... [truncated message content] |
From: <z-...@us...> - 2008-02-05 17:06:10
|
Revision: 7743 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7743&view=rev Author: z-man Date: 2008-02-05 09:06:10 -0800 (Tue, 05 Feb 2008) Log Message: ----------- Enabling zones v2 (which is now the default) lets old and new zone types coexist, the new zone types just got a new network ID. In the new map-0.3.1-b.dtd, v1 zones and v2 zones can both be created; v1 zones are available as <Zone_v1 />. Modified Paths: -------------- armagetronad/trunk/armagetronad/configure.ac armagetronad/trunk/armagetronad/src/Makefile.am armagetronad/trunk/armagetronad/src/tools/tMemManager.cpp armagetronad/trunk/armagetronad/src/tron/gGame.cpp armagetronad/trunk/armagetronad/src/tron/gParser.cpp armagetronad/trunk/armagetronad/src/tron/gParser.h armagetronad/trunk/armagetronad/src/tron/gWinZone.cpp armagetronad/trunk/armagetronad/src/tron/gWinZone.h armagetronad/trunk/armagetronad/src/tron/zone/zZone.cpp Added Paths: ----------- armagetronad/trunk/armagetronad/resource/proto/map-0.3.1-b.dtd Modified: armagetronad/trunk/armagetronad/configure.ac =================================================================== --- armagetronad/trunk/armagetronad/configure.ac 2008-02-05 16:29:03 UTC (rev 7742) +++ armagetronad/trunk/armagetronad/configure.ac 2008-02-05 17:06:10 UTC (rev 7743) @@ -158,8 +158,8 @@ AC_ARG_ENABLE(zonesv2, AC_HELP_STRING([--enable-zonesv2], - [enable experimental zonesv2 code (default=disabled)]),, -enable_zonesv2=no) + [enable experimental zonesv2 code (default=enabled)]),, +enable_zonesv2=yes) AC_ARG_ENABLE(automakedefaults, AC_HELP_STRING([--enable-automakedefaults], Copied: armagetronad/trunk/armagetronad/resource/proto/map-0.3.1-b.dtd (from rev 7738, armagetronad/trunk/armagetronad/resource/proto/map-0.3.1-a.dtd) =================================================================== --- armagetronad/trunk/armagetronad/resource/proto/map-0.3.1-b.dtd (rev 0) +++ armagetronad/trunk/armagetronad/resource/proto/map-0.3.1-b.dtd 2008-02-05 17:06:10 UTC (rev 7743) @@ -0,0 +1,172 @@ +<!-- version="0.3.1-b" --> +<!ELEMENT Resource (Map)> + +<!ATTLIST Resource + type (aamap) "aamap" + name CDATA #REQUIRED + version CDATA "1.0" + author CDATA "Anonymous" + category CDATA "unsorted" + comissioner CDATA #IMPLIED +> + +<!ELEMENT Map (Settings?, World)> + +<!ELEMENT Settings (Setting*)> +<!ELEMENT Setting EMPTY> +<!ATTLIST Setting name CDATA #REQUIRED> +<!ATTLIST Setting value CDATA #REQUIRED> + +<!-- ATM, a map contain only one Field --> +<!ELEMENT World (Field)> +<!-- a field + - may have an axes declared + - need at least one spawn + - need at least one wall --> +<!ELEMENT Field (Axes?, Ownership?, (Spawn | Wall | Monitor | Zone | Zone_v1 )*)> + +<!ELEMENT Axes (Axis*)> +<!ELEMENT Ownership (TeamOwnership*)> +<!ELEMENT Spawn EMPTY> +<!ELEMENT Wall (Point+) > +<!ELEMENT Point EMPTY> +<!ELEMENT Axis EMPTY> +<!ELEMENT Zone ((ShapeCircle | ShapePolygon), (Enter | Inside | Leave | Outside)+ ) > + +<!ATTLIST Map version CDATA #REQUIRED> + +<!ATTLIST Field logicalBox (true | false) "true"> + +<!ATTLIST Axes number CDATA "4"> +<!ATTLIST Axes normalize (true | false) "true"> + +<!ATTLIST Spawn x CDATA #REQUIRED> +<!ATTLIST Spawn y CDATA #REQUIRED> +<!ATTLIST Spawn xdir CDATA #IMPLIED> +<!ATTLIST Spawn ydir CDATA #IMPLIED> +<!ATTLIST Spawn angle CDATA #IMPLIED> +<!ATTLIST Spawn length CDATA "1.0"> + +<!ATTLIST Wall height CDATA #IMPLIED> + +<!ATTLIST Point x CDATA #REQUIRED> +<!ATTLIST Point y CDATA #REQUIRED> + +<!ATTLIST Axis xdir CDATA #IMPLIED> +<!ATTLIST Axis ydir CDATA #IMPLIED> +<!ATTLIST Axis angle CDATA #IMPLIED> +<!ATTLIST Axis length CDATA "1.0"> + + +<!ATTLIST Zone name CDATA ""> + +<!ELEMENT Monitor (OnOver | OnUnder | InRange | OutsideRange)+ > +<!ATTLIST Monitor name CDATA #REQUIRED> +<!ATTLIST Monitor init CDATA "0.0"> +<!ATTLIST Monitor drift CDATA "0.0"> +<!ATTLIST Monitor low CDATA "0.0"> +<!ATTLIST Monitor high CDATA "1.0"> + +<!ELEMENT OnOver (EffectGroup | ZoneInfluence | MonitorInfluence)+ > +<!ATTLIST OnOver value CDATA #REQUIRED> + +<!ELEMENT OnUnder (EffectGroup | ZoneInfluence | MonitorInfluence)+ > +<!ATTLIST OnUnder value CDATA #REQUIRED> + +<!ELEMENT InRange (EffectGroup | ZoneInfluence | MonitorInfluence)+ > +<!ATTLIST InRange low CDATA #REQUIRED> +<!ATTLIST InRange high CDATA #REQUIRED> + +<!ELEMENT OutsideRange (EffectGroup | ZoneInfluence | MonitorInfluence)+ > +<!ATTLIST OutsideRange low CDATA #REQUIRED> +<!ATTLIST OutsideRange high CDATA #REQUIRED> + + +<!ELEMENT ShapeCircle (Point, Color?)> +<!ATTLIST ShapeCircle scale CDATA "1.0"> +<!ATTLIST ShapeCircle growth CDATA "0.0"> +<!ATTLIST ShapeCircle rotation CDATA "0.0"> +<!ATTLIST ShapeCircle radius CDATA "1.0"> + +<!ELEMENT ShapePolygon (Point, Color, Point+)> +<!ATTLIST ShapePolygon scale CDATA "1.0"> +<!ATTLIST ShapePolygon growth CDATA "0.0"> +<!ATTLIST ShapePolygon rotation CDATA "0.0"> + +<!ELEMENT Color EMPTY> +<!ATTLIST Color red CDATA "1.0"> +<!ATTLIST Color green CDATA "0.0"> +<!ATTLIST Color blue CDATA "0.0"> +<!ATTLIST Color alpha CDATA "0.7"> +<!ATTLIST Color hexCode CDATA #IMPLIED> +<!ATTLIST Color name CDATA #IMPLIED> + + +<!ELEMENT Enter (EffectGroup+) > +<!ELEMENT Inside (EffectGroup+) > +<!ELEMENT Leave (EffectGroup+) > +<!ELEMENT Outside (EffectGroup+) > + +<!ELEMENT EffectGroup (User)> +<!ATTLIST EffectGroup owners CDATA #IMPLIED> +<!ATTLIST EffectGroup teamOwners CDATA #IMPLIED> + +<!ELEMENT User (Target | MonitorInfluence | ZoneInfluence)+ > +<!ATTLIST User user (all | owner | ownerTeam | allButOwner | allButTeamOwner | anotherTeammate) "all" > +<!ATTLIST User positive (true | false | ignore) "ignore" > +<!ATTLIST User marked (true | false | ignore) "ignore" > + + +<!ELEMENT Target (Effect)+ > +<!ATTLIST Target target (self | teammate | team | all | allButSelf | + another | +owner | ownerTeam | ownerTeamTeammate | anyDead | +allDead | anotherTeammateDead | anotherNotTeammateDead | +singleDeadOwner +) "self" > +<!-- +<!ATTLIST Target target (self | teammate | team | all | allButSelf | +allButTeam | another | anotherTeam | anotherTeammate | +anotherNotTeammate | owner | ownerTeam | ownerTeamTeammate | anyDead | +allDead | AnotherTeammateDead | anotherNotTeammateDead) "self" > +--> +<!ATTLIST Target count CDATA "-1"> + + +<!ELEMENT Effect EMPTY> +<!ATTLIST Effect effect (win | death | point | brakerecharge | +rubberrecharge | acceleration | spawnplayer | setting ) "death" > +<!ATTLIST Effect count CDATA "-1"> +<!ATTLIST Effect description CDATA #IMPLIED> +<!ATTLIST Effect score CDATA "1"> <!-- only for point --> +<!ATTLIST Effect settingName CDATA #IMPLIED> <!-- only for setting --> +<!ATTLIST Effect settingValue CDATA #IMPLIED><!-- only for setting --> +<!ATTLIST Effect value CDATA "0"> <!-- only for acceleration atm, but should be for nearly all --> + +<!ELEMENT MonitorInfluence EMPTY> +<!ATTLIST MonitorInfluence name CDATA #IMPLIED> +<!ATTLIST MonitorInfluence marked (true | false | ignore) "ignore"> +<!ATTLIST MonitorInfluence influenceSlide CDATA #IMPLIED> +<!ATTLIST MonitorInfluence influenceAdd CDATA #IMPLIED> +<!ATTLIST MonitorInfluence influenceSet CDATA #IMPLIED> + + +<!ELEMENT ZoneInfluence (Rotation | Scale | Point | Color)+ > +<!ATTLIST ZoneInfluence name CDATA #IMPLIED> + +<!ELEMENT Rotation EMPTY> +<!ATTLIST Rotation rotationAngle CDATA "0.0"> +<!ATTLIST Rotation rotationSpeed CDATA "0.0"> + + +<!ELEMENT Scale EMPTY> +<!ATTLIST Scale scale CDATA "1.0"> + +<!ELEMENT TeamOwnership EMPTY> +<!ATTLIST TeamOwnership teamId CDATA #REQUIRED> +<!ATTLIST TeamOwnership playerId CDATA #IMPLIED> + +<!ELEMENT Zone_v1 (ShapeCircle) > +<!ATTLIST Zone_v1 effect (win | death | fortress ) "death" > + + Modified: armagetronad/trunk/armagetronad/src/Makefile.am =================================================================== --- armagetronad/trunk/armagetronad/src/Makefile.am 2008-02-05 16:29:03 UTC (rev 7742) +++ armagetronad/trunk/armagetronad/src/Makefile.am 2008-02-05 17:06:10 UTC (rev 7743) @@ -163,10 +163,10 @@ tron/zone/zSelector.h tron/zone/zSelector.cpp\ tron/zone/zEffector.h tron/zone/zEffector.cpp\ tron/zone/zZoneInfluence.h tron/zone/zZoneInfluence.cpp -else +endif + libtron_a_SOURCES +=\ tron/gWinZone.h tron/gWinZone.cpp -endif libui_a_SOURCES=ui/uInput.cpp ui/uInput.h ui/uInputQueue.cpp ui/uInputQueue.h ui/uMenu.cpp ui/uMenu.h endif Modified: armagetronad/trunk/armagetronad/src/tools/tMemManager.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tools/tMemManager.cpp 2008-02-05 16:29:03 UTC (rev 7742) +++ armagetronad/trunk/armagetronad/src/tools/tMemManager.cpp 2008-02-05 17:06:10 UTC (rev 7743) @@ -1337,7 +1337,7 @@ tAllocationInfo info( true ); #ifdef LEAKFINDER #ifndef HAVE_LIBZTHREAD - info.checksum = size; + info.checksum = size % MAXCHECKSUM; #endif #endif return tMemMan::Alloc(info, size); Modified: armagetronad/trunk/armagetronad/src/tron/gGame.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gGame.cpp 2008-02-05 16:29:03 UTC (rev 7742) +++ armagetronad/trunk/armagetronad/src/tron/gGame.cpp 2008-02-05 17:06:10 UTC (rev 7743) @@ -66,9 +66,8 @@ #include "gTeam.h" #ifdef ENABLE_ZONESV2 #include "zone/zZone.h" -#else -#include "gWinZone.cpp" #endif +#include "gWinZone.cpp" #include "eVoter.h" #include "tRecorder.h" #include "gStatistics.h" @@ -128,15 +127,6 @@ #define DEFAULT_MAP "Anonymous/polygon/regular/square-1.0.1.aamap.xml" static tString mapfile(DEFAULT_MAP); -#ifdef ENABLE_ZONESV2 -// The following are only relevant in the case of zones from maps using version 1 -static REAL sg_conquestRate = .5; -static REAL sg_defendRate = .25; - -static tSettingItem< REAL > sg_conquestRateConf( "FORTRESS_CONQUEST_RATE", sg_conquestRate ); -static tSettingItem< REAL > sg_defendRateConf( "FORTRESS_DEFEND_RATE", sg_defendRate ); -#endif - /* static void sg_ParseMap ( gParser * aParser, tString map_file ); static void change_mapfile(std::istream &s) Modified: armagetronad/trunk/armagetronad/src/tron/gParser.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gParser.cpp 2008-02-05 16:29:03 UTC (rev 7742) +++ armagetronad/trunk/armagetronad/src/tron/gParser.cpp 2008-02-05 17:06:10 UTC (rev 7743) @@ -31,10 +31,10 @@ #ifdef ENABLE_ZONESV2 #include <boost/tokenizer.hpp> // to support splitting a string on "," #include <boost/shared_ptr.hpp> -#else -#include "gWinZone.h" #endif +#include "gWinZone.h" + #ifdef __MINGW32__ #define xmlFree(x) free(x) #endif @@ -60,9 +60,6 @@ static tString polygonal_shape_used(DEFAULT_POLYGONAL_SHAPE_USED); static nSettingItemWatched<tString> safetymecanism_polygonal_shapeused("POLYGONAL_SHAPE_USED",polygonal_shape_used, nConfItemVersionWatcher::Group_Breaking, 20 ); -// The following are only relevant in the case of zones from maps using version 1 -static REAL sg_conquestDecayRate = .1; -static tSettingItem< REAL > sg_conquestDecayRateConf( "FORTRESS_CONQUEST_DECAY_RATE", sg_conquestDecayRate ); #endif int mapVersion = 0; // The version of the map currently being parsed. Used to adapt parsing to support version specific features @@ -535,8 +532,8 @@ color = myxmlGetPropColorFromHex(cur, "hexCode"); } - if (color.a_ > 0.7) - color.a_ = 0.7; + if (color.a_ > 1.0) + color.a_ = 1.0; if (color.a_ < 0.0) color.a_ = 0.0; @@ -1217,13 +1214,13 @@ return currentZoneEffect; } +// emulate v1 zone behavior with v2 zones void -gParser::parseZoneArthemis(eGrid * grid, xmlNodePtr cur, const xmlChar * keyword) +gParser::parseZoneArthemis_v2(eGrid * grid, xmlNodePtr cur, const xmlChar * keyword) { - if (sn_GetNetState() != nCLIENT ) { - rColor color; + rColor color( 1, 0, 0, .7 ); // Create a new zone zZonePtr zone = zZonePtr(new zZone(grid)); @@ -1383,7 +1380,7 @@ if (sn_GetNetState() != nCLIENT ) { - rColor color; + rColor color( 1, 0, 0, .7 ); zZonePtr zone; zoneMap::const_iterator iterZone; @@ -1464,7 +1461,8 @@ } } } -#else +#endif + bool gParser::parseShapeCircle(eGrid *grid, xmlNodePtr cur, float &x, float &y, float &radius, float& growth, const xmlChar * keyword) { @@ -1490,25 +1488,11 @@ } return false; } -#endif -void -gParser::parseZone(eGrid * grid, xmlNodePtr cur, const xmlChar * keyword) +// original v1 zone parsing code. Return value: was it a success? +bool +gParser::parseZoneArthemis_v1(eGrid * grid, xmlNodePtr cur, const xmlChar * keyword) { -#ifdef ENABLE_ZONESV2 - switch (mapVersion) - { - case 1: - parseZoneArthemis(grid, cur, keyword); - break; - case 2: - parseZoneBachus(grid, cur, keyword); - break; - default: - parseZoneBachus(grid, cur, keyword); - break; - } -#else float x, y, radius, growth; bool shapeFound = false; xmlNodePtr shape = cur->xmlChildrenNode; @@ -1526,6 +1510,11 @@ shape = shape->next; } + if ( !shapeFound ) + { + return false; + } + gZone * zone = NULL; if (sn_GetNetState() != nCLIENT ) { @@ -1539,7 +1528,7 @@ zone = tNEW( gBaseZoneHack) ( grid, eCoord(x*sizeMultiplier,y*sizeMultiplier) ); } - // leaving zone undeleted is no memory leak here, the gid takes control of it + // leaving zone undeleted is no memory leak here, the grid takes control of it if ( zone ) { zone->SetRadius( radius*sizeMultiplier ); @@ -1548,6 +1537,39 @@ zone->RequestSync(); } } + + return zone; +} + +void +gParser::parseZone(eGrid * grid, xmlNodePtr cur, const xmlChar * keyword) +{ +#ifdef ENABLE_ZONESV2 + switch (mapVersion) + { + case 1: + // was, technically, without zones IIRC. But let's parse it anyway + case 2: + // switch to v2 when some sort of emulation layer is ready + // we should probably check for the DTD, too; v1 zones are only possible + // for 0.2.x dtds and 0.3.1-b and later, and v2 zones only for 0.3.1-a and + // later. + if( !parseZoneArthemis_v1(grid, cur, keyword) ) + { + parseZoneBachus(grid, cur, keyword); + } + break; + case 3: + // well, the above is a really ugly hack to keep things working, better + // let users of pure zone v2 maps upgrade them to map version 3. + parseZoneBachus(grid, cur, keyword); + break; + default: + parseZoneBachus(grid, cur, keyword); + break; + } +#else + parseZoneArthemis_v1(grid, cur, keyword); #endif } @@ -1820,6 +1842,9 @@ else if (isElement(cur->name, (const xmlChar *)"Zone", keyword)) { parseZone(grid, cur, keyword); } + else if (isElement(cur->name, (const xmlChar *)"Zone_v1", keyword)) { + parseZoneArthemis_v1(grid, cur, keyword); + } else if (isElement(cur->name, (const xmlChar *)"Wall", keyword)) { parseWall(grid, cur, keyword); } @@ -1900,6 +1925,9 @@ else if (isElement(cur->name, (const xmlChar *)"Zone", keyword)) { parseZone(grid, cur, keyword); } + else if (isElement(cur->name, (const xmlChar *)"Zone_v1", keyword)) { + parseZoneArthemis_v1(grid, cur, keyword); + } else if (isElement(cur->name, (const xmlChar *)"Wall", keyword)) { parseWall(grid, cur, keyword); } Modified: armagetronad/trunk/armagetronad/src/tron/gParser.h =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gParser.h 2008-02-05 16:29:03 UTC (rev 7742) +++ armagetronad/trunk/armagetronad/src/tron/gParser.h 2008-02-05 17:06:10 UTC (rev 7743) @@ -76,8 +76,9 @@ void parseAxes(eGrid *grid, xmlNodePtr cur, const xmlChar * keyword); void parseSpawn(eGrid *grid, xmlNodePtr cur, const xmlChar * keyword); void parseZone(eGrid *grid, xmlNodePtr cur, const xmlChar * keyword); + bool parseZoneArthemis_v1(eGrid * grid, xmlNodePtr cur, const xmlChar * keyword); #ifdef ENABLE_ZONESV2 - void parseZoneArthemis(eGrid * grid, xmlNodePtr cur, const xmlChar * keyword); + void parseZoneArthemis_v2(eGrid * grid, xmlNodePtr cur, const xmlChar * keyword); void parseZoneBachus(eGrid * grid, xmlNodePtr cur, const xmlChar * keyword); rColor parseColor(eGrid *grid, xmlNodePtr cur, const xmlChar * keyword); #endif @@ -102,9 +103,9 @@ typedef std::map<string, std::set<string> >::value_type TeamOwnershipInfoType; void parseOwnership(eGrid *grid, xmlNodePtr cur, const xmlChar * keyword); void parseTeamOwnership(eGrid *grid, xmlNodePtr cur, const xmlChar * keyword, TeamOwnershipInfo & team); -#else +#endif bool parseShapeCircle(eGrid *grid, xmlNodePtr cur, float &x, float &y, float &radius, float &growth, const xmlChar *keyword); -#endif + void parseField(eGrid *grid, xmlNodePtr cur, const xmlChar * keyword); void parseWorld(eGrid *grid, xmlNodePtr cur, const xmlChar * keyword = NULL); void parseMap(eGrid *grid, xmlNodePtr cur, const xmlChar * keyword = NULL); Modified: armagetronad/trunk/armagetronad/src/tron/gWinZone.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gWinZone.cpp 2008-02-05 16:29:03 UTC (rev 7742) +++ armagetronad/trunk/armagetronad/src/tron/gWinZone.cpp 2008-02-05 17:06:10 UTC (rev 7743) @@ -51,8 +51,8 @@ static int sg_zoneDeath = 1; static tSettingItem<int> sg_zoneDeathConf( "WIN_ZONE_DEATHS", sg_zoneDeath ); -static REAL sg_expansionSpeed = 1.0f; -static REAL sg_initialSize = 5.0f; +REAL sg_expansionSpeed = 1.0f; +REAL sg_initialSize = 5.0f; static nSettingItem< REAL > sg_expansionSpeedConf( "WIN_ZONE_EXPANSION", sg_expansionSpeed ); static nSettingItem< REAL > sg_initialSizeConf( "WIN_ZONE_INITIAL_SIZE", sg_initialSize ); @@ -754,9 +754,9 @@ { } -static REAL sg_conquestRate = .5; -static REAL sg_defendRate = .25; -static REAL sg_conquestDecayRate = .1; +REAL sg_conquestRate = .5; +REAL sg_defendRate = .25; +REAL sg_conquestDecayRate = .1; static tSettingItem< REAL > sg_conquestRateConf( "FORTRESS_CONQUEST_RATE", sg_conquestRate ); static tSettingItem< REAL > sg_defendRateConf( "FORTRESS_DEFEND_RATE", sg_defendRate ); Modified: armagetronad/trunk/armagetronad/src/tron/gWinZone.h =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gWinZone.h 2008-02-05 16:29:03 UTC (rev 7742) +++ armagetronad/trunk/armagetronad/src/tron/gWinZone.h 2008-02-05 17:06:10 UTC (rev 7743) @@ -36,6 +36,15 @@ #include "rColor.h" #include "tFunction.h" +// zone expansion speed and size +extern REAL sg_expansionSpeed; +extern REAL sg_initialSize; + +// fortress conquest rates +extern REAL sg_conquestDecayRate; +extern REAL sg_conquestRate; +extern REAL sg_defendRate; + class eTeam; //! basic zone class: handles rendering and entwork syncing Modified: armagetronad/trunk/armagetronad/src/tron/zone/zZone.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/zone/zZone.cpp 2008-02-05 16:29:03 UTC (rev 7742) +++ armagetronad/trunk/armagetronad/src/tron/zone/zZone.cpp 2008-02-05 17:06:10 UTC (rev 7743) @@ -49,17 +49,13 @@ #include <deque> #include <iterator> -std::deque<zZone *> sg_Zones; +#include "gWinZone.h" +std::deque<zZone *> sz_Zones; + // number of segments to render a zone with static const int sg_segments = 11; -static REAL sg_expansionSpeed = 1.0f; -static REAL sg_initialSize = 5.0f; - -static nSettingItem< REAL > sg_expansionSpeedConf( "WIN_ZONE_EXPANSION", sg_expansionSpeed ); -static nSettingItem< REAL > sg_initialSizeConf( "WIN_ZONE_INITIAL_SIZE", sg_initialSize ); - // ******************************************************************************* // * // * EvaluateFunctionNow @@ -120,7 +116,7 @@ // add to game grid this->AddToList(); - sg_Zones.push_back(this); + sz_Zones.push_back(this); // initialize position functions // SetPosition( pos ); @@ -158,7 +154,7 @@ // add to game grid this->AddToList(); - sg_Zones.push_back(this); + sz_Zones.push_back(this); // initialize position functions // SetPosition( pos ); @@ -249,14 +245,14 @@ void zZone::RemoveFromZoneList(void) { std::deque<zZone *>::iterator pos_found = std::find_if( - sg_Zones.begin(), - sg_Zones.end(), + sz_Zones.begin(), + sz_Zones.end(), std::bind2nd( std::equal_to<zZone *>(), this) ); - if(pos_found != sg_Zones.end()) - sg_Zones.erase(pos_found); + if(pos_found != sz_Zones.end()) + sz_Zones.erase(pos_found); } // ******************************************************************************* @@ -626,7 +622,7 @@ } // the zone's network initializator -static nNOInitialisator<zZone> zone_init(340,"zone"); +static nNOInitialisator<zZone> zone_init(341,"zonev2"); // ******************************************************************************* // * This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <z-...@us...> - 2008-02-05 23:53:08
|
Revision: 7748 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7748&view=rev Author: z-man Date: 2008-02-05 15:53:05 -0800 (Tue, 05 Feb 2008) Log Message: ----------- Merging branch 0.2.8 from revision 7731 to 7747: ------------------------------------------------------------------------ r7747 | z-man | 2008-02-06 00:41:20 +0100 (Wed, 06 Feb 2008) | 2 lines Fixed ed's crash. My bad. Already dead sparks were being accessed. ------------------------------------------------------------------------ r7744 | wrtlprnft | 2008-02-05 19:38:06 +0100 (Tue, 05 Feb 2008) | 2 lines ZONA_ALPHA_TOGGLE: allows people like epsy to render zones as if alpha blending was switched off. (not merged, no use) ------------------------------------------------------------------------ r7741 | wrtlprnft | 2008-02-05 16:37:09 +0100 (Tue, 05 Feb 2008) | 2 lines You can now specify the amount of indentation for wrapped console lines by using CONSOLE_INDENT. ------------------------------------------------------------------------ r7739 | z-man | 2008-02-05 16:12:29 +0100 (Tue, 05 Feb 2008) | 2 lines Whoops, forgot to keep the checksum in a reasonable range. ------------------------------------------------------------------------ r7737 | wrtlprnft | 2008-02-05 12:25:12 +0100 (Tue, 05 Feb 2008) | 2 lines Print a message when the server exits due to DEDICATED_IDLE ------------------------------------------------------------------------ r7736 | z-man | 2008-02-05 00:33:00 +0100 (Tue, 05 Feb 2008) | 2 lines Trimming whitespace from the end of the argument of /login. ------------------------------------------------------------------------ r7735 | z-man | 2008-02-05 00:15:38 +0100 (Tue, 05 Feb 2008) | 2 lines Informing users about delays in the login process. ------------------------------------------------------------------------ r7732 | nemostultae | 2008-02-04 22:01:45 +0100 (Mon, 04 Feb 2008) | 2 lines Updated Mac OS X project file after auth branch merge. nAuthentification -> nAuthentication ------------------------------------------------------------------------ Revision Links: -------------- http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7731&view=rev Modified Paths: -------------- armagetronad/trunk/armagetronad/NEWS armagetronad/trunk/armagetronad/language/english_base.txt armagetronad/trunk/armagetronad/src/engine/eGameObject.cpp armagetronad/trunk/armagetronad/src/engine/eGameObject.h armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp armagetronad/trunk/armagetronad/src/engine/eSensor.cpp armagetronad/trunk/armagetronad/src/engine/eSensor.h armagetronad/trunk/armagetronad/src/network/nAuthentication.cpp armagetronad/trunk/armagetronad/src/render/rConsoleGraph.cpp armagetronad/trunk/armagetronad/src/tron/gGame.cpp armagetronad/trunk/armagetronad/src/tron/gSparks.cpp armagetronad/trunk/armagetronad/src/tron/gSparks.h Modified: armagetronad/trunk/armagetronad/NEWS =================================================================== --- armagetronad/trunk/armagetronad/NEWS 2008-02-05 23:41:20 UTC (rev 7747) +++ armagetronad/trunk/armagetronad/NEWS 2008-02-05 23:53:05 UTC (rev 7748) @@ -138,8 +138,10 @@ arbitrary things like /foobarz or /mode ctf - CONSOLE_LADDER_LOG boolean places the ladderlog on stdout prefixed with "[L] " -- PLAYER_MESSAGE <user ID or name> <Message>: Like /msg, but from the +- PLAYER_MESSAGE <user ID or name> <Message>: Like /msg, but from the console +- ZONE_ALPHA_TOGGLE: When rendering zones ZONE_ALPHA_TOGGLE xor ALPHA_BLEND + determines whether to render zones as filled rectangles If --enable-armathentication was activated: - ACCESS_LEVEL_IPS to let admins see IPs of players in the list. @@ -213,6 +215,8 @@ - NUM_HUMANS <n>: There are <n> players that are not AIs and are part of a team. - ROUND_SCORE has the player's team's score appended. +- Wrapped console lines are indented by an amount of spaces that can be + specified using the setting CONSOLE_INDENT. Bugfixes -------- Modified: armagetronad/trunk/armagetronad/language/english_base.txt =================================================================== --- armagetronad/trunk/armagetronad/language/english_base.txt 2008-02-05 23:41:20 UTC (rev 7747) +++ armagetronad/trunk/armagetronad/language/english_base.txt 2008-02-05 23:53:05 UTC (rev 7748) @@ -664,11 +664,13 @@ poly_antialias_help Enable polygon antialiasing persp_correct_help Enable perspective correction alpha_blend_help Enable alpha blending +zone_alpha_toggle_help This is XORd with ALPHA_BLEND to determine the way to draw zones smooth_shading_help Enable smooth shading text_out_help Enable console text output console_columns_help Number of characters in each line of console output console_rows_help Number of lines of console output without user intervention console_rows_max_help Number of lines of console output when scrolling back +console_indent_help Number of spaces each continuation of a wrapped console line is indented by console_decorate_id_help Decorates every line of console output with the client ID console_decorate_ip_help Decorates every line of console output with the client IP console_ladder_log_help Sends ladder log output to the console @@ -2676,6 +2678,7 @@ hash_method_blacklist_help List of hash authentication methods to disable support for. login_message_requested User \1 requests authentication as "\2@\3".\n +login_message_delayed Your login process will be delayed because the server configuration makes it impossible to be processed immedeately in the background. We're sorry for the inconvenience.\n login_message_responded Password request sent to user \1, username "\2", method \3, message "\4".\n login_message \3\1 has been logged in as \2.\n login_message_byorder Order of \1: Modified: armagetronad/trunk/armagetronad/src/engine/eGameObject.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/engine/eGameObject.cpp 2008-02-05 23:41:20 UTC (rev 7747) +++ armagetronad/trunk/armagetronad/src/engine/eGameObject.cpp 2008-02-05 23:53:05 UTC (rev 7748) @@ -82,30 +82,23 @@ void eGameObject::RemoveFromGame() { - int oldID = id; - if ( oldID >= 0 ) - { - AddRef(); - } + tJUST_CONTROLLED_PTR< eGameObject > keepAlive; + if ( id >= 0 ) + keepAlive = this; OnRemoveFromGame(); DoRemoveFromGame(); - - if ( oldID >= 0 ) - { - Release(); - } } // called on RemoveFromGame(). Call base class implementation, too, in your implementation. void eGameObject::OnRemoveFromGame() { + // remove from grid + currentFace = 0; + // remove from lists RemoveFromListsAll(); - - // remove from grid - currentFace = 0; } @@ -874,5 +867,44 @@ } } +eReferencableGameObject::eReferencableGameObject(eGrid *grid, const eCoord &p,const eCoord &d, eFace *currentface, bool autodelete) +: eGameObject( grid, p, d, currentface, autodelete ) +{ +} +// delegate real reference counting +void eReferencableGameObject::AddRef() +{ + tReferencable< eReferencableGameObject >::AddRef(); +} +void eReferencableGameObject::Release() +{ + tReferencable< eReferencableGameObject >::Release(); +} + +void eReferencableGameObject::DoRemoveFromGame() +{ + // nothing needs to be done, the reference counting takes care of the destruction +} + +eStackGameObject::eStackGameObject(eGrid *grid, const eCoord &p,const eCoord &d, eFace *currentface) +: eGameObject( grid, p, d, currentface, false ) +{ +} + +void eStackGameObject::AddRef() +{ +} + +void eStackGameObject::Release() +{ +} + +void eStackGameObject::DoRemoveFromGame() +{ + // must not get called + tERR_ERROR("Stack game object removed from game."); +} + + Modified: armagetronad/trunk/armagetronad/src/engine/eGameObject.h =================================================================== --- armagetronad/trunk/armagetronad/src/engine/eGameObject.h 2008-02-05 23:41:20 UTC (rev 7747) +++ armagetronad/trunk/armagetronad/src/engine/eGameObject.h 2008-02-05 23:53:05 UTC (rev 7748) @@ -32,6 +32,7 @@ #include "tList.h" // #include "eGrid.h" #include "eCoord.h" +#include "tSafePTR.h" class eGrid; class uActionPlayer; @@ -102,8 +103,8 @@ eGrid* Grid() const { return grid; } eFace* CurrentFace() const { return currentFace; } - virtual void AddRef(){}; //!< adds a reference - virtual void Release(){}; //!< removes a reference + virtual void AddRef() = 0; //!< adds a reference + virtual void Release() = 0; //!< removes a reference void AddToList(); void RemoveFromList(); @@ -215,6 +216,34 @@ static void DeleteAll(eGrid *grid); }; +// game object to be created on the heap +class eReferencableGameObject: public eGameObject, public tReferencable< eReferencableGameObject > +{ +public: + eReferencableGameObject(eGrid *grid, const eCoord &p,const eCoord &d, eFace *currentface, bool autodelete=1); + + // real reference counting + virtual void AddRef(); //!< adds a reference + virtual void Release(); //!< removes a reference + +private: + virtual void DoRemoveFromGame(); //!< called when removed from the game +}; + +// game object of temporary lifetime on the stack +class eStackGameObject: public eGameObject +{ +public: + eStackGameObject(eGrid *grid, const eCoord &p,const eCoord &d, eFace *currentface); + + // dummy reference counting + virtual void AddRef(); //!< adds a reference + virtual void Release(); //!< removes a reference + +private: + virtual void DoRemoveFromGame(); //!< called when removed from the game +}; + //! Exception to throw when a gameobject dies during movement class eDeath { Modified: armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp 2008-02-05 23:41:20 UTC (rev 7747) +++ armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp 2008-02-05 23:53:05 UTC (rev 7748) @@ -2286,20 +2286,33 @@ // the following function really is only supposed to be called from here and nowhere else // (access right escalation risk): // log in (via admin password or hash based login) -static void se_AdminLogin_ReallyOnlyCallFromChatKTHNXBYE( ePlayerNetID * p, tString const & say ) +static void se_AdminLogin_ReallyOnlyCallFromChatKTHNXBYE( ePlayerNetID * p, std::istream & s ) { tString params(""); - if (say.StrPos(" ") == -1) - { + params.ReadLine( s ); #ifndef KRAWALL_SERVER + if ( params == "" ) return; #endif - } - else + + // trim whitespace + + // for the trunk: + // params.Trim(); + // here,we have to do the work manually { - params = say.SubStr(say.StrPos(" ") + 1); + int lastNonSpace = params.Len() - 2; + while ( lastNonSpace >= 0 && isblank(params[lastNonSpace]) ) + { + --lastNonSpace; + } + + if ( lastNonSpace < params.Len() - 2 ) + { + params = params.SubStr( 0, lastNonSpace + 1 ); + } } - + #ifndef KRAWALL_SERVER // the password is not stored in the recording, hence we have to store the // result of the password test @@ -2404,7 +2417,7 @@ { // the following function really is only supposed to be called from here and nowhere else // (access right escalation risk) - se_AdminLogin_ReallyOnlyCallFromChatKTHNXBYE( p, say ); + se_AdminLogin_ReallyOnlyCallFromChatKTHNXBYE( p, s ); } else if (command == "/logout") { Modified: armagetronad/trunk/armagetronad/src/engine/eSensor.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/engine/eSensor.cpp 2008-02-05 23:41:20 UTC (rev 7747) +++ armagetronad/trunk/armagetronad/src/engine/eSensor.cpp 2008-02-05 23:53:05 UTC (rev 7748) @@ -35,7 +35,7 @@ #endif eSensor::eSensor(eGameObject *o,const eCoord &start,const eCoord &d) - :eGameObject(o->grid, start,d,o->currentFace,0) + :eStackGameObject(o->grid, start,d,o->currentFace) ,hit(1000),ehit(NULL),lr(0), owned(o) , inverseSpeed_(0) { if (owned) Modified: armagetronad/trunk/armagetronad/src/engine/eSensor.h =================================================================== --- armagetronad/trunk/armagetronad/src/engine/eSensor.h 2008-02-05 23:41:20 UTC (rev 7747) +++ armagetronad/trunk/armagetronad/src/engine/eSensor.h 2008-02-05 23:53:05 UTC (rev 7748) @@ -36,7 +36,7 @@ class eSensorFinished{}; // sensor sent out to detect near eWalls -class eSensor: public eGameObject{ +class eSensor: public eStackGameObject{ public: REAL hit; // where is the eWall? tCHECKED_PTR_CONST(eHalfEdge) ehit; // the eWall we sense Modified: armagetronad/trunk/armagetronad/src/network/nAuthentication.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/network/nAuthentication.cpp 2008-02-05 23:41:20 UTC (rev 7747) +++ armagetronad/trunk/armagetronad/src/network/nAuthentication.cpp 2008-02-05 23:53:05 UTC (rev 7748) @@ -391,6 +391,16 @@ { // install self reference to keep this object alive selfReference_ = this; + + // inform the user about delays + bool delays = false; +#ifdef HAVE_LIBZTHREAD + delays = tRecorder::IsRunning(); +#endif + if ( delays ) + { + sn_ConsoleOut( tOutput( "$login_message_delayed" ), userID ); + } } ~nLoginProcess() Modified: armagetronad/trunk/armagetronad/src/render/rConsoleGraph.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/render/rConsoleGraph.cpp 2008-02-05 23:41:20 UTC (rev 7747) +++ armagetronad/trunk/armagetronad/src/render/rConsoleGraph.cpp 2008-02-05 23:53:05 UTC (rev 7748) @@ -67,6 +67,9 @@ static int sr_columns = 78; static tConfItem<int> sr_columnsConf("CONSOLE_COLUMNS",sr_columns); +static int sr_indent = 3; +static tConfItem<int> sr_indentConf("CONSOLE_INDENT",sr_indent); + void rConsole::Render(){ if (!sr_glOut) return; @@ -108,7 +111,7 @@ rTextField out(-.95f,.99f,rCHEIGHT_CON, sr_fontConsole);//,&rFont::s_defaultFontSmall); out.SetWidth(1.9f); out.EnableLineWrap(); - out.SetIndent(3); + out.SetIndent(sr_indent); int i; for (i=currentTop;i<=currentIn && i<=currentTop+MaxHeight();i++) Modified: armagetronad/trunk/armagetronad/src/tron/gGame.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gGame.cpp 2008-02-05 23:41:20 UTC (rev 7747) +++ armagetronad/trunk/armagetronad/src/tron/gGame.cpp 2008-02-05 23:53:05 UTC (rev 7748) @@ -1453,6 +1453,8 @@ if (sg_NumUsers() <= 0 && ded_idle>0.0001 && tSysTimeFloat()>= startTime + ded_idle * 3600 ) { + sg_Timestamp(); + con << "Server exiting due to DEDICATED_IDLE after " << (tSysTimeFloat() - startTime)/3600 << " hours.\n"; uMenu::quickexit = true; } } Modified: armagetronad/trunk/armagetronad/src/tron/gSparks.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gSparks.cpp 2008-02-05 23:41:20 UTC (rev 7747) +++ armagetronad/trunk/armagetronad/src/tron/gSparks.cpp 2008-02-05 23:53:05 UTC (rev 7748) @@ -37,7 +37,7 @@ bool white_sparks=false; gSpark::gSpark(eGrid *grid, const eCoord &pos,const eCoord &dir,REAL time,REAL ocolor_r,REAL ocolor_g,REAL ocolor_b,REAL ecolor_r,REAL ecolor_g,REAL ecolor_b) - :eGameObject(grid, pos, dir , NULL, true), + :eReferencableGameObject(grid, pos, dir , NULL, true), // sound(scrap), createTime(time){ lastTime=createTime; Modified: armagetronad/trunk/armagetronad/src/tron/gSparks.h =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gSparks.h 2008-02-05 23:41:20 UTC (rev 7747) +++ armagetronad/trunk/armagetronad/src/tron/gSparks.h 2008-02-05 23:53:05 UTC (rev 7748) @@ -34,7 +34,7 @@ #include "eGameObject.h" #include "rModel.h" -class gSpark: public eGameObject{ // When the player nearly hits a eWall +class gSpark: public eReferencableGameObject{ // When the player nearly hits a eWall REAL createTime; #ifndef USEPARTICLES This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wrt...@us...> - 2008-02-11 12:58:40
|
Revision: 7857 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7857&view=rev Author: wrtlprnft Date: 2008-02-11 04:58:40 -0800 (Mon, 11 Feb 2008) Log Message: ----------- Added some support for textures in cockpits and for resource textures in general :-) The map background texture I committed is temporary and just a demonstration and an example. It's waiting for a better design :-) Modified Paths: -------------- armagetronad/trunk/armagetronad/resource/proto/Anonymous/original/original.cockpit.xml armagetronad/trunk/armagetronad/resource/proto/cockpit.dtd armagetronad/trunk/armagetronad/resource/proto/resource.dtd armagetronad/trunk/armagetronad/src/render/rGradient.cpp armagetronad/trunk/armagetronad/src/render/rGradient.h armagetronad/trunk/armagetronad/src/render/rTexture.cpp armagetronad/trunk/armagetronad/src/render/rTexture.h armagetronad/trunk/armagetronad/src/tools/tResourceManager.cpp armagetronad/trunk/armagetronad/src/tools/tResourceManager.h armagetronad/trunk/armagetronad/src/tron/cockpit/cGauges.cpp armagetronad/trunk/armagetronad/src/tron/cockpit/cMap.cpp armagetronad/trunk/armagetronad/src/tron/cockpit/cRectangle.cpp armagetronad/trunk/armagetronad/src/tron/cockpit/cWidgetBase.cpp armagetronad/trunk/armagetronad/src/tron/cockpit/cWidgetBase.h Modified: armagetronad/trunk/armagetronad/resource/proto/Anonymous/original/original.cockpit.xml =================================================================== --- armagetronad/trunk/armagetronad/resource/proto/Anonymous/original/original.cockpit.xml 2008-02-11 11:34:46 UTC (rev 7856) +++ armagetronad/trunk/armagetronad/resource/proto/Anonymous/original/original.cockpit.xml 2008-02-11 12:58:40 UTC (rev 7857) @@ -270,8 +270,11 @@ <Position x="0.73" y="-0.72" /> <Size height="0.25" width="0.25" /> <Background> + <Image scale_x="2" scale_y="2"> + <Graphic category="" author="wrtlprnft" version="1" name="wood_512" extension="jpg" uri="http://wrtlprnft.ath.cx/wood512.jpg" /> + </Image> <Solid> - <Color r="1." g="1." b="1." alpha=".2" /> + <Color r="1." g="1." b="1." alpha=".5" /> </Solid> </Background> <MapModes toggleKey="1"> Modified: armagetronad/trunk/armagetronad/resource/proto/cockpit.dtd =================================================================== --- armagetronad/trunk/armagetronad/resource/proto/cockpit.dtd 2008-02-11 11:34:46 UTC (rev 7856) +++ armagetronad/trunk/armagetronad/resource/proto/cockpit.dtd 2008-02-11 12:58:40 UTC (rev 7857) @@ -166,13 +166,25 @@ <!-- Graphic is a regular graphic file, like something.png. ResourceGraphic is a resource xml file that contains more information on the image and may be a case of YouMightNeedThis --> <!ELEMENT Image (Graphic?,ResourceGraphic?)> +<!ATTLIST Image + scale_x CDATA '1' + scale_y CDATA '1' +> +<!ELEMENT Graphic EMPTY> +<!ATTLIST Graphic + name CDATA #REQUIRED + author CDATA 'Anonymous' + version CDATA #REQUIRED + category CDATA 'unsorted' + extension CDATA 'png' + uri CDATA "" +> + <!ELEMENT Solid (Color?)> <!ELEMENT Gradient (Color+)> <!ATTLIST Gradient orientation (horizontal | vertical | value) "value"> -<!ELEMENT Graphic (Location?)> - <!ELEMENT ResourceGraphic (Location?)> <!ELEMENT Color EMPTY> Modified: armagetronad/trunk/armagetronad/resource/proto/resource.dtd =================================================================== --- armagetronad/trunk/armagetronad/resource/proto/resource.dtd 2008-02-11 11:34:46 UTC (rev 7856) +++ armagetronad/trunk/armagetronad/resource/proto/resource.dtd 2008-02-11 12:58:40 UTC (rev 7857) @@ -3,8 +3,8 @@ <!ATTLIST Resource type CDATA "%ResourceType;" name CDATA #REQUIRED - author CDATA #REQUIRED - version CDATA 'Anonymous' + author CDATA 'Anonymous' + version CDATA #REQUIRED category CDATA 'unsorted' commissioner CDATA #IMPLIED > Modified: armagetronad/trunk/armagetronad/src/render/rGradient.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/render/rGradient.cpp 2008-02-11 11:34:46 UTC (rev 7856) +++ armagetronad/trunk/armagetronad/src/render/rGradient.cpp 2008-02-11 12:58:40 UTC (rev 7857) @@ -32,10 +32,12 @@ #include <deque> #include <utility> -rGradient::rGradient() : m_dir(value) { +rGradient::rGradient() : m_dir(value), m_texScale(1,1), m_tex() { //(*this)[0.]=rColor(); //make sure the beginning and end are defined //(*this)[1.]=rColor(); } +rGradient::~rGradient() { +} //! @param edge1 the first edge of the gradient (preferably bottom- left) //! @param edge2 the second edge of the gradient (preferably top- right) @@ -107,16 +109,21 @@ #endif } +void rGradient::DrawAt(tCoord const &where) { + GetColor(GetGradientPt(where)).Apply(); + if(m_tex.Tex()) { + glTexCoord2f((where.x-m_origin.x)/m_dimensions.x/m_texScale.x, (where.y-m_origin.y)/m_dimensions.y/m_texScale.y); + } +} + //! @param edge1 one edge of the rectangle //! @param edge2 the opposite edge void rGradient::DrawAtomicRect(tCoord const &edge1, tCoord const &edge2) { #ifndef DEDICATED - BeginQuads(); DrawPoint(edge1); DrawPoint(tCoord(edge1.x, edge2.y)); DrawPoint(edge2); DrawPoint(tCoord(edge2.x, edge1.y)); - RenderEnd(); #endif } @@ -126,6 +133,8 @@ #ifndef DEDICATED float tCoord::*x; //those are correct for horizontal gradients, float tCoord::*y; //vertical ones just get turned around + BeginDraw(); + BeginQuads(); switch(m_dir) { case horizontal: x = &tCoord::x; @@ -137,6 +146,7 @@ break; default: DrawAtomicRect(edge1, edge2); + RenderEnd(); return; } tCoord const &left = (edge1.*x < edge2.*x) ? edge1 : edge2; @@ -161,13 +171,21 @@ todraw.*x = last; todraw.*y = left.*y; DrawAtomicRect(todraw, right); + RenderEnd(); #endif } +void se_glFloorTexture(); +void rGradient::BeginDraw() { + if(m_tex.Tex()) { + m_tex.Tex()->Select(); + } +} + //! @param where the point the color should be taken from and drawn void rGradient::DrawPoint(tCoord const &where) { #ifndef DEDICATED - GetColor(where).Apply(); + DrawAt(where); Vertex(where.x, where.y); #endif } Modified: armagetronad/trunk/armagetronad/src/render/rGradient.h =================================================================== --- armagetronad/trunk/armagetronad/src/render/rGradient.h 2008-02-11 11:34:46 UTC (rev 7856) +++ armagetronad/trunk/armagetronad/src/render/rGradient.h 2008-02-11 12:58:40 UTC (rev 7857) @@ -31,6 +31,7 @@ #include "defs.h" #include "rColor.h" #include "tCoord.h" +#include "rTexture.h" #include <map> #include <deque> #include <utility> @@ -41,14 +42,18 @@ float m_at; //!< current value, used when m_dir == value tCoord m_origin; //!< bottom-left point of the gradient tCoord m_dimensions; //!< width and height of it + tCoord m_texScale; //!< scale factor of the texture //! return the relevant value (x, y or m_at) depending on m_dir float GetGradientPt(tCoord const &where); //! get the color for a given point on the gradient, using only //! the relevant coordinate (as returned by GetGradientPt) rColor GetColor(float where); + + rResourceTexture m_tex; public: rGradient(); //!< Constructor + ~rGradient(); //!< Destructor //! Enum for describing the direction of the gradient enum direction { @@ -58,24 +63,30 @@ }; //! Sets the type/direction of the gradient //! @param dir the desired type/direction - void SetDir(direction dir) { m_dir = dir; }; + void SetDir(direction dir) { m_dir = dir; } //! set the value, only used when the type is "value" //! @param at the value, 1 should be the maximum and 0 the minimum - void SetValue(float at) { m_at = at; }; + void SetValue(float at) { m_at = at; } //! set the boundaries of the gradient void SetGradientEdges(tCoord const &edge1, tCoord const edge2); - //! get the color at a certain point + //! set the color and texture coordinate at the given point //! @param where the point in the gradient. If it lies outside the edges of the gradient the nearest possible point will be used - //! @returns the color at the specific point - rColor GetColor(tCoord const &where) { return GetColor(GetGradientPt(where)); }; + void DrawAt(tCoord const &where); //! Draw a rectangle using only the colors of the edges void DrawAtomicRect(tCoord const &edge1, tCoord const &edge2); //!Draw a rectangle, but split it up into multiple rectangles if necessary void DrawRect(tCoord const &edge1, tCoord const &edge2); - //! call Color() with the color at the given coordinate and then call Vertex() on it + //! Send a single vertex with the correct color and texture information to OpenGL void DrawPoint(tCoord const &where); + + //! Initialize OpenGL for drawing with this gradient + void BeginDraw(); + + //! Set the texture to be overlaid with the gradient + void SetTexture(rResourceTexture const &tex) {m_tex = tex;} + void SetTextureScale(tCoord const &scale) {m_texScale = scale;} }; #endif Modified: armagetronad/trunk/armagetronad/src/render/rTexture.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/render/rTexture.cpp 2008-02-11 11:34:46 UTC (rev 7856) +++ armagetronad/trunk/armagetronad/src/render/rTexture.cpp 2008-02-11 12:58:40 UTC (rev 7857) @@ -96,10 +96,10 @@ //! // ****************************************************************************************** -rSurface::rSurface( char const * fileName ) +rSurface::rSurface( char const * fileName, tPath const * path ) { Init(); - Create( fileName ); + Create( fileName, path ); } // ****************************************************************************************** @@ -213,19 +213,23 @@ //! // ****************************************************************************************** -void rSurface::Create( char const * fileName ) +void rSurface::Create( char const * fileName, tPath const *path ) { #ifndef DEDICATED sr_LockSDL(); - // find path of image - // tString s = tResourceManager::locateResource("", fileName); - tString s = tDirectories::Data().GetReadPath( fileName ); - - // Load image IMG_InvertAlpha(true); - Create( IMG_Load(s) ); + // find path of image and load it + SDL_Surface *surface; + if(path) { + tString s = path->GetReadPath( fileName ); + surface = IMG_Load(s); + } else { + surface = IMG_Load(fileName); + } + Create(surface); + //if ( surface_ ) // std::cerr << "loaded surface " << fileName << "\n"; @@ -650,9 +654,10 @@ //! // ****************************************************************************************** -rFileTexture::rFileTexture( int group, char const * fileName, bool repx, bool repy, bool storeAlpha ) +rFileTexture::rFileTexture( int group, char const * fileName, bool repx, bool repy, bool storeAlpha, tPath const *path ) : rISurfaceTexture( group, repx, repy, storeAlpha ) , fileName_( fileName ) + , path_(path) { } @@ -682,7 +687,7 @@ { #ifndef DEDICATED // std::cerr << "loading texture " << fileName_ << "\n"; - rSurface surface( fileName_ ); + rSurface surface( fileName_, path_ ); if ( surface.GetSurface() ) { this->Upload( surface ); @@ -773,3 +778,46 @@ static rCallbackBeforeScreenModeChange unload(&rITexture::UnloadAll); // static rCallbackAfterScreenModeChange load(&rITexture::LoadAll); + +rResourceTexture::texlist_t rResourceTexture::textures; + +rResourceTexture rResourceTexture::GetTexture(tResourcePath const &path) { + for(texlist_t::iterator iter = textures.begin(); iter != textures.end(); ++iter) { + if((*iter)->path_ == path) { + ++(*iter)->use_; + return *iter; + } + } + return new tex_t(path); +} + +rResourceTexture::InternalTex::InternalTex(tResourcePath const &path) : rFileTexture(rTextureGroups::TEX_OBJ, tResourceManager::locateResource(path.Path().c_str()).c_str(), true, true, true, 0), use_(0), path_(path) { + textures.push_back(this); +} + +void rResourceTexture::InternalTex::Release() { + if(--use_ < 1) { + for(texlist_t::iterator iter = textures.begin(); iter != textures.end(); ++iter) { + if((*iter)->path_ == path_) { + textures.erase(iter); + break; + } + } + Unload(); + delete this; + } +} + +rResourceTexture &rResourceTexture::operator=(rResourceTexture const &other) { + if(tex_ != other.tex_) { + if(tex_) { + tex_->Release(); + } + tex_ = other.tex_; + if(tex_) { + tex_->Use(); + } + } + return *this; +} + Modified: armagetronad/trunk/armagetronad/src/render/rTexture.h =================================================================== --- armagetronad/trunk/armagetronad/src/render/rTexture.h 2008-02-11 11:34:46 UTC (rev 7856) +++ armagetronad/trunk/armagetronad/src/render/rTexture.h 2008-02-11 12:58:40 UTC (rev 7857) @@ -29,9 +29,12 @@ #define ArmageTron_TEXTURE_H #include "tString.h" +#include "tResourceManager.h" +#include "tDirectories.h" #include "tList.h" #include "rGL.h" #include "rGLuintObject.h" +#include <list> struct SDL_Surface; @@ -57,7 +60,7 @@ class rSurface { public: - explicit rSurface( char const * fileName ); //!< constructor creating the surface from a file + explicit rSurface( char const * fileName, tPath const *path = &tDirectories::Data() ); //!< constructor creating the surface from a file ~rSurface(); //!< destructor rSurface( rSurface const & other ); //!< copy constructor rSurface & operator = ( rSurface const & other ); //!< copy operator @@ -65,7 +68,7 @@ rSurface(); //!< default constructor, not creating a real surface void Init(); //!< initialize data members void Clear(); //!< destroys data members - void Create( char const * fileName ); //!< create surface from file + void Create( char const * fileName, tPath const *path = &tDirectories::Data() ); //!< create surface from file void Create( SDL_Surface * surface ); //!< take ownership of surface private: @@ -160,13 +163,14 @@ { public: rFileTexture(int group, char const * fileName, bool repx=0, bool repy=0, - bool storeAlpha=false); //!< constructor setting flags + bool storeAlpha=false, tPath const *path = &tDirectories::Data()); //!< constructor setting flags virtual ~rFileTexture(); //!< destructor protected: virtual void OnSelect(); //!< Selects the texture for rendering (core part) private: tString fileName_; //!< the texture's filename + tPath const *path_; public: inline tString const & GetFileName( void ) const; //!< Gets the texture's filename @@ -176,6 +180,49 @@ inline rFileTexture & SetFileName( tString const & fileName ); //!< Sets the texture's filename }; +class rResourceTextureWrapper; + +//! Class that implements fetching and caching textures from resource paths. +//! +//! This class manages its own usecount and is therefore safe to copy and move around. +class rResourceTexture +{ + class InternalTex; + friend class InternalTex; + class InternalTex : public rFileTexture + { + public: + int use_; + tResourcePath path_; + + InternalTex(tResourcePath const &path); + + void Release(); + void Use() {++use_;} + }; + typedef InternalTex tex_t; // don't ask me why this is needed. InteralTex just won't cut it in some places + typedef std::list<InternalTex *> texlist_t; + static texlist_t textures; + InternalTex *tex_; + rResourceTexture(InternalTex *tex) : tex_(tex) { tex->Use();} +public: + //! Use this if you want to create an empty texture object (ie if you're not sure if you actually want to store a texture) + rResourceTexture() : tex_(0) {} + //! Copy constructor + rResourceTexture(rResourceTexture const &other) : tex_(other.tex_) {if(tex_) tex_->Use();} + //! Assignment is safe + rResourceTexture &operator=(rResourceTexture const &other); + //! This releases the texture if it's not used anymore + ~rResourceTexture() {if(tex_) tex_->Release();} + //! Get the actual texture. This object retains ownership of the texture, though + rFileTexture *Tex() {return tex_;} + //! Get the path this texture was fetched from + tResourcePath const &Path() {return tex_->path_;} + + //! Get a resource from a path. This is the only way to obtain a new rResourceTexture + static rResourceTexture GetTexture(tResourcePath const &path); +}; + // ****************************************************************************************** //! texture class getting its data from a surface @@ -389,5 +436,3 @@ } #endif - - Modified: armagetronad/trunk/armagetronad/src/tools/tResourceManager.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tools/tResourceManager.cpp 2008-02-11 11:34:46 UTC (rev 7856) +++ armagetronad/trunk/armagetronad/src/tools/tResourceManager.cpp 2008-02-11 12:58:40 UTC (rev 7857) @@ -242,3 +242,36 @@ static tConfItemFunc s_RInclude("RINCLUDE", &RInclude); +tResourcePath::tResourcePath(tString const &Author, + tString const &Category, + tString const &Name, + tString const &Version, + tString const &Type, + tString const &Extension, + tString const &URI) : + m_Author (Author ), + m_Category (Category ), + m_Name (Name ), + m_Version (Version ), + m_Type (Type ), + m_Extension(Extension), + m_URI (URI ) { + // TODO: check for illegal characters + m_Path << Author << '/'; + if(!Category.empty()) { + m_Path << Category << '/'; + } + m_Path << Name << '-' << Version << '.' << Type << '.' << Extension; + if(!URI.empty()) { + m_Path << '(' << URI << ')'; + } +} + +bool tResourcePath::operator==(tResourcePath const &other) const { + return m_Author == other.m_Author && + m_Category == other.m_Category && + m_Name == other.m_Name && + m_Version == other.m_Version && + m_Type == other.m_Type && + m_Extension == other.m_Extension; +} Modified: armagetronad/trunk/armagetronad/src/tools/tResourceManager.h =================================================================== --- armagetronad/trunk/armagetronad/src/tools/tResourceManager.h 2008-02-11 11:34:46 UTC (rev 7856) +++ armagetronad/trunk/armagetronad/src/tools/tResourceManager.h 2008-02-11 12:58:40 UTC (rev 7857) @@ -45,4 +45,37 @@ static void RegisterLoader(); }; +//! helper class to construct a resource path +class tResourcePath +{ + tString m_Author; //!< the author of the resource + tString m_Category; //!< the category of the resource + tString m_Name; //!< the name of the resource + tString m_Version; //!< the version of the resource + tString m_Type; //!< the type of the resource + tString m_Extension;//!< the extension (like xml or png) + tString m_URI; //!< the URI to the file, if any + tString m_Path; //!< the full path of the resource +public: + tString const &Author () const {return m_Author ;} //!< get the author of the resource + tString const &Category () const {return m_Category ;} //!< get the category of the resource + tString const &Name () const {return m_Name ;} //!< get the name of the resource + tString const &Version () const {return m_Version ;} //!< get the version of the resource + tString const &Type () const {return m_Type ;} //!< get the type of the resource + tString const &Extension() const {return m_Extension;} //!< get the extension (like xml or png) + tString const &URI () const {return m_URI ;} //!< get the URI to the file, if any + tString const &Path () const {return m_Path ;} //!< get the full path of the resource + + //! construct the path from the given arguments + tResourcePath(tString const &Author, + tString const &Category, + tString const &Name, + tString const &Version, + tString const &Type, + tString const &Extension, + tString const &URI); + + bool operator==(tResourcePath const &other) const; +}; + #endif //ArmageTron_RESOURCEMANAGER_H Modified: armagetronad/trunk/armagetronad/src/tron/cockpit/cGauges.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/cockpit/cGauges.cpp 2008-02-11 11:34:46 UTC (rev 7856) +++ armagetronad/trunk/armagetronad/src/tron/cockpit/cGauges.cpp 2008-02-11 12:58:40 UTC (rev 7857) @@ -200,7 +200,7 @@ BeginLines(); m_foreground.SetValue((factor * ((val-min)/(max-min)*2. - 1.)+1.)/2.); - m_foreground.GetColor(tCoord(0.,0.)).Apply(); + m_foreground.DrawAt(tCoord(0.,0.)); Vertex(-.1*x*m_size.x+m_position.x,.1*y*m_size.y+m_position.y,0); Vertex(-x*m_size.x+m_position.x,y*m_size.y+m_position.y,0); RenderEnd(); Modified: armagetronad/trunk/armagetronad/src/tron/cockpit/cMap.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/cockpit/cMap.cpp 2008-02-11 11:34:46 UTC (rev 7856) +++ armagetronad/trunk/armagetronad/src/tron/cockpit/cMap.cpp 2008-02-11 12:58:40 UTC (rev 7857) @@ -81,14 +81,14 @@ glClipPlane(GL_CLIP_PLANE3, pl3); glEnable(GL_CLIP_PLANE3); // Add frame ... - map.m_foreground.GetColor(tCoord(0.,0.)).Apply(); + map.m_foreground.BeginDraw(); glBegin(GL_LINE_STRIP); //TODO: this should use a function of the rGradient. - glVertex2f(e1.x, e1.y); - glVertex2f(e2.x, e1.y); - glVertex2f(e2.x, e2.y); - glVertex2f(e1.x, e2.y); - glVertex2f(e1.x, e1.y); + map.m_foreground.DrawPoint(e1); + map.m_foreground.DrawPoint(tCoord(e2.x, e1.y)); + map.m_foreground.DrawPoint(e2); + map.m_foreground.DrawPoint(tCoord(e1.x, e2.y)); + map.m_foreground.DrawPoint(e1); glEnd(); map.m_background.SetGradientEdges(e1, e2); map.m_background.DrawRect(e1, e2); @@ -150,7 +150,7 @@ for(int i = 0; i < m_edges; ++i) { float t = (i+1)*stepsize; tCoord next(centre.x+ab.x*cos(t), centre.y-ab.y*sin(t)); - map.m_foreground.GetColor(tCoord(0.,0.)).Apply(); + map.m_foreground.DrawAt(tCoord(0.,0.)); glBegin(GL_LINES); //TODO: this should use a function of the rGradient. glVertex2f(next.x, next.y); @@ -382,12 +382,14 @@ void Map::DrawRimWalls( tList<eWallRim> &list ) { if(sr_alphaBlend && m_mode == MODE_STD) { - m_background.GetColor(tCoord(0.,0.)).Apply(); + const eRectangle &bounds = eWallRim::GetBounds(); + m_background.SetGradientEdges(bounds.GetLow(), bounds.GetHigh()); + m_background.BeginDraw(); glBegin(GL_POLYGON); for(std::vector<tCoord>::iterator iter = se_rimWallRubberBand.begin(); iter != se_rimWallRubberBand.end(); ++iter) { - glVertex2f(iter->x, iter->y); + m_background.DrawPoint(*iter); } - glVertex2f(se_rimWallRubberBand.front().x, se_rimWallRubberBand.front().y); + m_background.DrawPoint(se_rimWallRubberBand.front()); glEnd(); } glColor4f(1, 1, 1, .5); Modified: armagetronad/trunk/armagetronad/src/tron/cockpit/cRectangle.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/cockpit/cRectangle.cpp 2008-02-11 11:34:46 UTC (rev 7856) +++ armagetronad/trunk/armagetronad/src/tron/cockpit/cRectangle.cpp 2008-02-11 12:58:40 UTC (rev 7857) @@ -64,6 +64,7 @@ m_foreground.SetValue(where); m_background.SetValue(where); + m_background.BeginDraw(); m_background.DrawRect(edge1, edge2); } Modified: armagetronad/trunk/armagetronad/src/tron/cockpit/cWidgetBase.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/cockpit/cWidgetBase.cpp 2008-02-11 11:34:46 UTC (rev 7856) +++ armagetronad/trunk/armagetronad/src/tron/cockpit/cWidgetBase.cpp 2008-02-11 12:58:40 UTC (rev 7857) @@ -28,6 +28,7 @@ #include "cockpit/cWidgetBase.h" #include "cockpit/cCockpit.h" #include "tValueParser.h" +#include "tResourceManager.h" #ifndef DEDICATED @@ -397,6 +398,12 @@ tERR_WARN("Gradient orientation '" + cur.GetProp("orientation") + "' unknown!"); } ProcessGradientCore(cur, ret); + } else if(name == "Image") { + tCoord scale; + cur.GetProp("scale_x", scale.x); + cur.GetProp("scale_y", scale.y); + ret.SetTextureScale(scale); + ProcessImage(cur, ret); } } return ret; @@ -416,6 +423,23 @@ } } +void WithColorFunctions::ProcessImage(tXmlParser::node cur, rGradient &gradient) { + for(cur = cur.GetFirstChild(); cur; ++cur) { + if(cur.IsOfType("Graphic")) { + tResourcePath path( + cur.GetProp("author"), + cur.GetProp("category"), + cur.GetProp("name"), + cur.GetProp("version"), + tString("aatex"), + cur.GetProp("extension"), + cur.GetProp("uri") + ); + gradient.SetTexture(rResourceTexture::GetTexture(path)); + } + } +} + bool WithForeground::Process(tXmlParser::node cur) { if(cur.IsOfType("Foreground")) { m_foreground = ProcessGradient(cur); Modified: armagetronad/trunk/armagetronad/src/tron/cockpit/cWidgetBase.h =================================================================== --- armagetronad/trunk/armagetronad/src/tron/cockpit/cWidgetBase.h 2008-02-11 11:34:46 UTC (rev 7856) +++ armagetronad/trunk/armagetronad/src/tron/cockpit/cWidgetBase.h 2008-02-11 12:58:40 UTC (rev 7857) @@ -36,6 +36,7 @@ #include "tXmlParser.h" #define DONTDOIT #include "rGradient.h" +#include "rTexture.h" #include <memory> #include "tSafePTR.h" @@ -156,6 +157,7 @@ protected: rGradient ProcessGradient(tXmlParser::node cur); //!< Processes the inside of a nodes like Foreground or Background void ProcessGradientCore(tXmlParser::node cur, rGradient &gradient); //!< Processes the inside of a Solid or Gradient nodes + void ProcessImage(tXmlParser::node cur, rGradient &gradient); //!< Processes the inside of an Image node public: bool Process(tXmlParser::node cur); //!< just passes on to Base::Process() }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <baz...@us...> - 2008-02-11 14:20:40
|
Revision: 7859 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7859&view=rev Author: bazaarmagetron Date: 2008-02-11 06:20:02 -0800 (Mon, 11 Feb 2008) Log Message: ----------- Manuel Moos: Crashfix: boost::shared_ptr -> tJUST_CONTROLLED_PTR (wrong kind of object for shared_ptr). Modified Paths: -------------- armagetronad/trunk/armagetronad/src/tron/zone/zMonitor.h Property Changed: ---------------- armagetronad/trunk/armagetronad/ Property changes on: armagetronad/trunk/armagetronad ___________________________________________________________________ Name: bzr:revision-info + timestamp: 2008-02-11 15:15:09.667999983 +0100 committer: Manuel Moos <z-...@us...> properties: branch-nick: armagetronad Name: bzr:file-ids + Name: bzr:revision-id:v3-list-QlpoOTFBWSZTWZvbKhsAAAdRgAAQABK6798QIABURMgAAaeoNT1TxT1DQbKaeobXKiyAmlWT7Y5MkdJOtXDtB7w7DOGFBHiOBxaUIu7HQyyQSvxdyRThQkJvbKhs + 613 z-...@us...-20080211141509-cwbrb6hmtz9313jr Modified: armagetronad/trunk/armagetronad/src/tron/zone/zMonitor.h =================================================================== --- armagetronad/trunk/armagetronad/src/tron/zone/zMonitor.h 2008-02-11 14:08:54 UTC (rev 7858) +++ armagetronad/trunk/armagetronad/src/tron/zone/zMonitor.h 2008-02-11 14:20:02 UTC (rev 7859) @@ -16,7 +16,7 @@ class zMonitorRule; class zMonitor; -typedef boost::shared_ptr<zMonitor> zMonitorPtr; +typedef tJUST_CONTROLLED_PTR<zMonitor> zMonitorPtr; typedef boost::shared_ptr<zMonitorRule> zMonitorRulePtr; typedef std::vector<zMonitorRulePtr> zMonitorRulePtrs; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wrt...@us...> - 2008-02-12 15:57:06
|
Revision: 7892 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7892&view=rev Author: wrtlprnft Date: 2008-02-12 07:57:10 -0800 (Tue, 12 Feb 2008) Log Message: ----------- Better texture support: You can now choose if you want your texture to repeat in the x-, y- or both directions. This needs two extra openGL calls per texture Select() since there can be multiple places using the same phyiscal texture with different settings, but that shouldn't be too much of a problem Made the interface a bit more intuitive: You can actually call the rResourceTexture constructor to get a texture and don't need to deal with the actual stored texture, which was dangerous because you could mess things up by calling its Unload() function. Modified Paths: -------------- armagetronad/trunk/armagetronad/resource/proto/Anonymous/original/original.cockpit.xml armagetronad/trunk/armagetronad/resource/proto/cockpit.dtd armagetronad/trunk/armagetronad/src/render/rGradient.cpp armagetronad/trunk/armagetronad/src/render/rTexture.cpp armagetronad/trunk/armagetronad/src/render/rTexture.h armagetronad/trunk/armagetronad/src/tron/cockpit/cWidgetBase.cpp armagetronad/trunk/armagetronad/src/tron/cockpit/cWidgetBase.h Modified: armagetronad/trunk/armagetronad/resource/proto/Anonymous/original/original.cockpit.xml =================================================================== --- armagetronad/trunk/armagetronad/resource/proto/Anonymous/original/original.cockpit.xml 2008-02-12 15:55:13 UTC (rev 7891) +++ armagetronad/trunk/armagetronad/resource/proto/Anonymous/original/original.cockpit.xml 2008-02-12 15:57:10 UTC (rev 7892) @@ -270,7 +270,7 @@ <Position x="0.73" y="-0.72" /> <Size height="0.25" width="0.25" /> <Background> - <Image scale_x="2" scale_y="2"> + <Image scale_x="1" scale_y="1" repeat="both"> <Graphic category="" author="wrtlprnft" version="1" name="wood_512" extension="jpg" uri="http://wrtlprnft.ath.cx/wood512.jpg" /> </Image> <Solid> Modified: armagetronad/trunk/armagetronad/resource/proto/cockpit.dtd =================================================================== --- armagetronad/trunk/armagetronad/resource/proto/cockpit.dtd 2008-02-12 15:55:13 UTC (rev 7891) +++ armagetronad/trunk/armagetronad/resource/proto/cockpit.dtd 2008-02-12 15:57:10 UTC (rev 7892) @@ -169,6 +169,7 @@ <!ATTLIST Image scale_x CDATA '1' scale_y CDATA '1' + repeat (none | x | y | both) 'both' > <!ELEMENT Graphic EMPTY> Modified: armagetronad/trunk/armagetronad/src/render/rGradient.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/render/rGradient.cpp 2008-02-12 15:55:13 UTC (rev 7891) +++ armagetronad/trunk/armagetronad/src/render/rGradient.cpp 2008-02-12 15:57:10 UTC (rev 7892) @@ -111,7 +111,7 @@ void rGradient::DrawAt(tCoord const &where) { GetColor(GetGradientPt(where)).Apply(); - if(m_tex.Tex()) { + if(m_tex.Valid()) { glTexCoord2f((where.x-m_origin.x)/m_dimensions.x/m_texScale.x, (where.y-m_origin.y)/m_dimensions.y/m_texScale.y); } } @@ -177,8 +177,8 @@ void se_glFloorTexture(); void rGradient::BeginDraw() { - if(m_tex.Tex()) { - m_tex.Tex()->Select(); + if(m_tex.Valid()) { + m_tex.Select(); } } Modified: armagetronad/trunk/armagetronad/src/render/rTexture.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/render/rTexture.cpp 2008-02-12 15:55:13 UTC (rev 7891) +++ armagetronad/trunk/armagetronad/src/render/rTexture.cpp 2008-02-12 15:57:10 UTC (rev 7892) @@ -34,6 +34,7 @@ #include "rScreen.h" #include "tDirectories.h" #include "tLocale.h" +#include "tConsole.h" #include "tException.h" #include "tResourceManager.h" @@ -781,17 +782,18 @@ rResourceTexture::texlist_t rResourceTexture::textures; -rResourceTexture rResourceTexture::GetTexture(tResourcePath const &path) { +rResourceTexture::rResourceTexture(tResourcePath const &path, bool repx, bool repy) : repx_(repx), repy_(repy) { for(texlist_t::iterator iter = textures.begin(); iter != textures.end(); ++iter) { if((*iter)->path_ == path) { - ++(*iter)->use_; - return *iter; + tex_ = *iter; + tex_->Use(); + return; } } - return new tex_t(path); + tex_ = new tex_t(path); } -rResourceTexture::InternalTex::InternalTex(tResourcePath const &path) : rFileTexture(rTextureGroups::TEX_OBJ, tResourceManager::locateResource(path.Path().c_str()).c_str(), true, true, true, 0), use_(0), path_(path) { +rResourceTexture::InternalTex::InternalTex(tResourcePath const &path) : rFileTexture(rTextureGroups::TEX_OBJ, tResourceManager::locateResource(path.Path().c_str()).c_str(), true, true, true, 0), use_(1), path_(path) { textures.push_back(this); } @@ -810,6 +812,8 @@ rResourceTexture &rResourceTexture::operator=(rResourceTexture const &other) { if(tex_ != other.tex_) { + repx_ = other.repx_; + repy_ = other.repy_; if(tex_) { tex_->Release(); } @@ -821,3 +825,19 @@ return *this; } +void rResourceTexture::Select() { + if(tex_) { + tex_->Select(); + // Override the actual tecture's settings + if(repx_) + glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT); + else + glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE); + if(repy_) + glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT); + else + glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE); + } else { + tERR_WARN("Trying to select a resource texture that's not loaded"); + } +} Modified: armagetronad/trunk/armagetronad/src/render/rTexture.h =================================================================== --- armagetronad/trunk/armagetronad/src/render/rTexture.h 2008-02-12 15:55:13 UTC (rev 7891) +++ armagetronad/trunk/armagetronad/src/render/rTexture.h 2008-02-12 15:57:10 UTC (rev 7892) @@ -132,7 +132,6 @@ //! when set, this flag inhibits storage of the alpha channel (for compatibility with some cards) static bool storageHack_; - protected: virtual void ProcessImage(SDL_Surface *); //!< process the surface before uploading it to GL @@ -204,23 +203,27 @@ typedef std::list<InternalTex *> texlist_t; static texlist_t textures; InternalTex *tex_; - rResourceTexture(InternalTex *tex) : tex_(tex) { tex->Use();} + + bool repx_, repy_; public: //! Use this if you want to create an empty texture object (ie if you're not sure if you actually want to store a texture) rResourceTexture() : tex_(0) {} + //! Get a resource from the repository + rResourceTexture(tResourcePath const &path, bool repx=false, bool repy=false); + //! Copy constructor rResourceTexture(rResourceTexture const &other) : tex_(other.tex_) {if(tex_) tex_->Use();} //! Assignment is safe rResourceTexture &operator=(rResourceTexture const &other); //! This releases the texture if it's not used anymore ~rResourceTexture() {if(tex_) tex_->Release();} + //! Check if this object stores a texture + bool Valid() {return tex_;} + //! Use this texture in OpenGL + void Select(); //! Get the actual texture. This object retains ownership of the texture, though - rFileTexture *Tex() {return tex_;} //! Get the path this texture was fetched from tResourcePath const &Path() {return tex_->path_;} - - //! Get a resource from a path. This is the only way to obtain a new rResourceTexture - static rResourceTexture GetTexture(tResourcePath const &path); }; // ****************************************************************************************** Modified: armagetronad/trunk/armagetronad/src/tron/cockpit/cWidgetBase.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/cockpit/cWidgetBase.cpp 2008-02-12 15:55:13 UTC (rev 7891) +++ armagetronad/trunk/armagetronad/src/tron/cockpit/cWidgetBase.cpp 2008-02-12 15:57:10 UTC (rev 7892) @@ -399,11 +399,23 @@ } ProcessGradientCore(cur, ret); } else if(name == "Image") { + int rep = 0; + std::map<tString, int> repeat; + repeat[tString("none")] = 0; + repeat[tString("x")] = 1; + repeat[tString("y")] = 2; + repeat[tString("both")] = 3; + std::map<tString, int>::iterator iter; + if((iter = repeat.find(cur.GetProp("repeat"))) != repeat.end()) { + rep = iter->second; + } else { + tERR_WARN("Repeat setting '" + cur.GetProp("repeat") + "' unknown!"); + } tCoord scale; cur.GetProp("scale_x", scale.x); cur.GetProp("scale_y", scale.y); ret.SetTextureScale(scale); - ProcessImage(cur, ret); + ProcessImage(cur, ret, rep); } } return ret; @@ -423,7 +435,7 @@ } } -void WithColorFunctions::ProcessImage(tXmlParser::node cur, rGradient &gradient) { +void WithColorFunctions::ProcessImage(tXmlParser::node cur, rGradient &gradient, int repeat) { for(cur = cur.GetFirstChild(); cur; ++cur) { if(cur.IsOfType("Graphic")) { tResourcePath path( @@ -435,7 +447,8 @@ cur.GetProp("extension"), cur.GetProp("uri") ); - gradient.SetTexture(rResourceTexture::GetTexture(path)); +std::cerr << "repeat: " << repeat << std::endl; + gradient.SetTexture(rResourceTexture(path, repeat & 1, repeat & 2)); } } } Modified: armagetronad/trunk/armagetronad/src/tron/cockpit/cWidgetBase.h =================================================================== --- armagetronad/trunk/armagetronad/src/tron/cockpit/cWidgetBase.h 2008-02-12 15:55:13 UTC (rev 7891) +++ armagetronad/trunk/armagetronad/src/tron/cockpit/cWidgetBase.h 2008-02-12 15:57:10 UTC (rev 7892) @@ -157,7 +157,7 @@ protected: rGradient ProcessGradient(tXmlParser::node cur); //!< Processes the inside of a nodes like Foreground or Background void ProcessGradientCore(tXmlParser::node cur, rGradient &gradient); //!< Processes the inside of a Solid or Gradient nodes - void ProcessImage(tXmlParser::node cur, rGradient &gradient); //!< Processes the inside of an Image node + void ProcessImage(tXmlParser::node cur, rGradient &gradient, int repeat); //!< Processes the inside of an Image node public: bool Process(tXmlParser::node cur); //!< just passes on to Base::Process() }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wrt...@us...> - 2008-02-13 16:36:48
|
Revision: 7903 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7903&view=rev Author: wrtlprnft Date: 2008-02-13 08:36:51 -0800 (Wed, 13 Feb 2008) Log Message: ----------- - Added more meaningful textures to the default cockpit - Tab completion handles /team and /admin a tad better now - Removed a leftover debug std::cerr Modified Paths: -------------- armagetronad/trunk/armagetronad/resource/proto/Anonymous/original/original.cockpit.xml armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp armagetronad/trunk/armagetronad/src/render/rGradient.cpp armagetronad/trunk/armagetronad/src/render/rGradient.h armagetronad/trunk/armagetronad/src/tron/cockpit/cMap.cpp armagetronad/trunk/armagetronad/src/tron/cockpit/cWidgetBase.cpp Modified: armagetronad/trunk/armagetronad/resource/proto/Anonymous/original/original.cockpit.xml =================================================================== --- armagetronad/trunk/armagetronad/resource/proto/Anonymous/original/original.cockpit.xml 2008-02-13 14:25:19 UTC (rev 7902) +++ armagetronad/trunk/armagetronad/resource/proto/Anonymous/original/original.cockpit.xml 2008-02-13 16:36:51 UTC (rev 7903) @@ -41,20 +41,23 @@ <Text value="Rubber" /> </Caption> <Background> - <Gradient orientation="value"> - <Color r="0." g="1." b="0." alpha=".0" at="0." /> - <Color r="0." g="1." b="0." alpha=".1" at=".3" /> - <Color r="1." g="1." b="1." alpha=".2" at=".4" /> - <Color r="1." g="1." b="1." alpha=".2" at="1." /> - </Gradient> + <Image> + <Graphic category="" author="wrtlprnft" version="1" name="gauge_horizontal" uri="http://wrtlprnft.ath.cx/gauge_horizontal.png" /> + </Image> + <Solid> + <Color r="1." g="1." b="1." alpha=".5" /> + </Solid> </Background> <Foreground> + <Image> + <Graphic category="" author="wrtlprnft" version="1" name="gauge_horizontal_filled" uri="http://wrtlprnft.ath.cx/gauge_horizontal_filled.png" /> + </Image> <Gradient orientation="value"> - <Color r="0." g="1." b="0." alpha=".7" at="0." /> - <Color r="0." g="1." b="0." alpha=".7" at=".3" /> - <Color r="1." g="1." b="0." alpha=".7" at=".6" /> - <Color r="1." g="0." b="0." alpha=".7" at=".8" /> - <Color r="1." g="0." b="0." alpha=".7" at="1." /> + <Color r="0." g="1." b="0." alpha=".9" at="0." /> + <Color r="0." g="1." b="0." alpha=".9" at=".3" /> + <Color r="1." g="1." b="0." alpha=".9" at=".6" /> + <Color r="1." g="0." b="0." alpha=".9" at=".8" /> + <Color r="1." g="0." b="0." alpha=".9" at="1." /> </Gradient> </Foreground> </BarGauge> @@ -73,15 +76,21 @@ <Text value="Brakes" /> </Caption> <Background> + <Image> + <Graphic category="" author="wrtlprnft" version="1" name="gauge_horizontal" uri="http://wrtlprnft.ath.cx/gauge_horizontal.png" /> + </Image> <Solid> - <Color r="1." g="1." b="1." alpha=".2" /> + <Color r="1." g="1." b="1." alpha=".5" /> </Solid> </Background> <Foreground> + <Image> + <Graphic category="" author="wrtlprnft" version="1" name="gauge_horizontal_filled" uri="http://wrtlprnft.ath.cx/gauge_horizontal_filled.png" /> + </Image> <Gradient orientation="value"> - <Color r="1." g="0." b="0." alpha=".7" at="0." /> - <Color r="1." g="1." b="0." alpha=".7" at=".5" /> - <Color r="0." g="1." b="0." alpha=".7" at="1." /> + <Color r="1." g="0." b="0." alpha=".9" at="0." /> + <Color r="1." g="1." b="0." alpha=".9" at=".5" /> + <Color r="0." g="1." b="0." alpha=".9" at="1." /> </Gradient> </Foreground> </BarGauge> @@ -270,11 +279,11 @@ <Position x="0.73" y="-0.72" /> <Size height="0.25" width="0.25" /> <Background> - <Image scale_x="1" scale_y="1" repeat="both"> - <Graphic category="" author="wrtlprnft" version="1" name="wood_512" extension="jpg" uri="http://wrtlprnft.ath.cx/wood512.jpg" /> + <Image scale_x=".075" scale_y=".075" repeat="both"> + <Graphic category="" author="wrtlprnft" version="1" name="floor" extension="png" uri="http://wrtlprnft.ath.cx/floor.png" /> </Image> <Solid> - <Color r="1." g="1." b="1." alpha=".5" /> + <Color r=".5" g="1." b=".5" alpha="1." /> </Solid> </Background> <MapModes toggleKey="1"> Modified: armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp 2008-02-13 14:25:19 UTC (rev 7902) +++ armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp 2008-02-13 16:36:51 UTC (rev 7903) @@ -3333,7 +3333,8 @@ tString actualString; if(pos - len == 0) { actualString = match + ": "; - } else if(pos - len == 5 && string.StartsWith("/msg ")) { + } else if(pos - len == 5 && string.StartsWith("/msg ") || string.StartsWith("/admin ")) { + } else if(pos - len == 6 && string.StartsWith("/team ")) { actualString = Simplify(match) + " "; } else { actualString = match + " "; Modified: armagetronad/trunk/armagetronad/src/render/rGradient.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/render/rGradient.cpp 2008-02-13 14:25:19 UTC (rev 7902) +++ armagetronad/trunk/armagetronad/src/render/rGradient.cpp 2008-02-13 16:36:51 UTC (rev 7903) @@ -109,6 +109,17 @@ #endif } +void rGradient::SetValues(tCoord const &where, float *position, float *color, float *texcoords) { + position[0] = where.x; + position[1] = where.y; + rColor c = GetColor(GetGradientPt(where)); + color[0] = c.r_; + color[1] = c.g_; + color[2] = c.b_; + texcoords[0] = (where.x-m_origin.x)/m_dimensions.x/m_texScale.x, + texcoords[1] = (where.y-m_origin.y)/m_dimensions.y/m_texScale.y; +} + void rGradient::DrawAt(tCoord const &where) { GetColor(GetGradientPt(where)).Apply(); if(m_tex.Valid()) { Modified: armagetronad/trunk/armagetronad/src/render/rGradient.h =================================================================== --- armagetronad/trunk/armagetronad/src/render/rGradient.h 2008-02-13 14:25:19 UTC (rev 7902) +++ armagetronad/trunk/armagetronad/src/render/rGradient.h 2008-02-13 16:36:51 UTC (rev 7903) @@ -74,6 +74,9 @@ //! @param where the point in the gradient. If it lies outside the edges of the gradient the nearest possible point will be used void DrawAt(tCoord const &where); + //! set the values you'd use for glDrawElements() + void SetValues(tCoord const &where, float *position, float *color, float *texcoords); + //! Draw a rectangle using only the colors of the edges void DrawAtomicRect(tCoord const &edge1, tCoord const &edge2); //!Draw a rectangle, but split it up into multiple rectangles if necessary Modified: armagetronad/trunk/armagetronad/src/tron/cockpit/cMap.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/cockpit/cMap.cpp 2008-02-13 14:25:19 UTC (rev 7902) +++ armagetronad/trunk/armagetronad/src/tron/cockpit/cMap.cpp 2008-02-13 16:36:51 UTC (rev 7903) @@ -134,31 +134,39 @@ } } void Map::ClipperCircle::Begin(Map &map, tCoord const &e1, tCoord const &e2) { - //glBegin(GL_LINES); - //Color(0,0,1); - //Vertex(e1.x, e1.y); - //Color(1,0,0); - //Vertex(e2.x, e2.y); - //glEnd(); - //Clip(0, tCoord((e1.x+e2.x)/2, e1.y), tCoord((e1.x+e2.x)/2,e2.y)); tCoord centre = .5*(e1+e2); tCoord ab = .5*(e2-e1); ab.x = fabs(ab.x); ab.y = fabs(ab.y); float stepsize=M_PI*2/m_edges; tCoord last = centre + tCoord(ab.x, 0); + map.m_background.BeginDraw(); + map.m_background.SetGradientEdges(centre - ab, centre + ab); + glBegin(GL_POLYGON); for(int i = 0; i < m_edges; ++i) { float t = (i+1)*stepsize; tCoord next(centre.x+ab.x*cos(t), centre.y-ab.y*sin(t)); - map.m_foreground.DrawAt(tCoord(0.,0.)); - glBegin(GL_LINES); - //TODO: this should use a function of the rGradient. + map.m_background.DrawPoint(next); + map.m_background.DrawPoint(last); + last = next; + } + glEnd(); + last = centre + tCoord(ab.x, 0); + map.m_foreground.SetGradientEdges(centre - ab, centre + ab); + map.m_foreground.BeginDraw(); + for(int i = 0; i < m_edges; ++i) { + float t = (i+1)*stepsize; + tCoord next(centre.x+ab.x*cos(t), centre.y-ab.y*sin(t)); + glBegin(GL_LINES); glVertex2f(next.x, next.y); glVertex2f(last.x, last.y); - glEnd(); + map.m_foreground.DrawPoint(next); + map.m_foreground.DrawPoint(last); + glEnd(); Clip(i, last, next); last = next; } + glDisable(GL_TEXTURE_2D); } void Map::ClipperCircle::End() { for(int i = 0; i < m_edges; ++i) { @@ -383,7 +391,9 @@ void Map::DrawRimWalls( tList<eWallRim> &list ) { if(sr_alphaBlend && m_mode == MODE_STD) { const eRectangle &bounds = eWallRim::GetBounds(); - m_background.SetGradientEdges(bounds.GetLow(), bounds.GetHigh()); + const tCoord dims = bounds.GetHigh() - bounds.GetLow(); + const float max = fmax(dims.x, dims.y); // make sure we get a square + m_background.SetGradientEdges(bounds.GetLow(), tCoord(bounds.GetLow().x + max, bounds.GetLow().y + max)); m_background.BeginDraw(); glBegin(GL_POLYGON); for(std::vector<tCoord>::iterator iter = se_rimWallRubberBand.begin(); iter != se_rimWallRubberBand.end(); ++iter) { @@ -392,6 +402,7 @@ m_background.DrawPoint(se_rimWallRubberBand.front()); glEnd(); } + glDisable(GL_TEXTURE_2D); glColor4f(1, 1, 1, .5); glBegin(GL_LINES); { Modified: armagetronad/trunk/armagetronad/src/tron/cockpit/cWidgetBase.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/cockpit/cWidgetBase.cpp 2008-02-13 14:25:19 UTC (rev 7902) +++ armagetronad/trunk/armagetronad/src/tron/cockpit/cWidgetBase.cpp 2008-02-13 16:36:51 UTC (rev 7903) @@ -447,7 +447,6 @@ cur.GetProp("extension"), cur.GetProp("uri") ); -std::cerr << "repeat: " << repeat << std::endl; gradient.SetTexture(rResourceTexture(path, repeat & 1, repeat & 2)); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wrt...@us...> - 2008-02-13 23:06:41
|
Revision: 7909 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7909&view=rev Author: wrtlprnft Date: 2008-02-13 15:06:45 -0800 (Wed, 13 Feb 2008) Log Message: ----------- The author and category attributes of <Graphic /> tags in cockpits no longer default to luke-jr's stupid choice of "Anonymous" and "unsorted", but to the author and category of the cockpit file that uses them. Modified Paths: -------------- armagetronad/trunk/armagetronad/resource/proto/Anonymous/original/original.cockpit.xml armagetronad/trunk/armagetronad/resource/proto/cockpit.dtd armagetronad/trunk/armagetronad/src/tools/tResourceManager.h armagetronad/trunk/armagetronad/src/tools/tXmlParser.cpp armagetronad/trunk/armagetronad/src/tools/tXmlParser.h armagetronad/trunk/armagetronad/src/tron/cockpit/cCockpit.cpp armagetronad/trunk/armagetronad/src/tron/cockpit/cCockpit.h armagetronad/trunk/armagetronad/src/tron/cockpit/cWidgetBase.cpp Modified: armagetronad/trunk/armagetronad/resource/proto/Anonymous/original/original.cockpit.xml =================================================================== --- armagetronad/trunk/armagetronad/resource/proto/Anonymous/original/original.cockpit.xml 2008-02-13 17:26:55 UTC (rev 7908) +++ armagetronad/trunk/armagetronad/resource/proto/Anonymous/original/original.cockpit.xml 2008-02-13 23:06:45 UTC (rev 7909) @@ -42,7 +42,7 @@ </Caption> <Background> <Image> - <Graphic category="" author="wrtlprnft" version="1" name="gauge_horizontal" uri="http://wrtlprnft.ath.cx/gauge_horizontal.png" /> + <Graphic author="wrtlprnft" version="1" name="gauge_horizontal" uri="http://wrtlprnft.ath.cx/gauge_horizontal.png" /> </Image> <Solid> <Color r="1." g="1." b="1." alpha=".5" /> @@ -50,7 +50,7 @@ </Background> <Foreground> <Image> - <Graphic category="" author="wrtlprnft" version="1" name="gauge_horizontal_filled" uri="http://wrtlprnft.ath.cx/gauge_horizontal_filled.png" /> + <Graphic author="wrtlprnft" version="1" name="gauge_horizontal_filled" uri="http://wrtlprnft.ath.cx/gauge_horizontal_filled.png" /> </Image> <Gradient orientation="value"> <Color r="0." g="1." b="0." alpha=".9" at="0." /> @@ -77,7 +77,7 @@ </Caption> <Background> <Image> - <Graphic category="" author="wrtlprnft" version="1" name="gauge_horizontal" uri="http://wrtlprnft.ath.cx/gauge_horizontal.png" /> + <Graphic author="wrtlprnft" version="1" name="gauge_horizontal" uri="http://wrtlprnft.ath.cx/gauge_horizontal.png" /> </Image> <Solid> <Color r="1." g="1." b="1." alpha=".5" /> @@ -85,7 +85,7 @@ </Background> <Foreground> <Image> - <Graphic category="" author="wrtlprnft" version="1" name="gauge_horizontal_filled" uri="http://wrtlprnft.ath.cx/gauge_horizontal_filled.png" /> + <Graphic author="wrtlprnft" version="1" name="gauge_horizontal_filled" uri="http://wrtlprnft.ath.cx/gauge_horizontal_filled.png" /> </Image> <Gradient orientation="value"> <Color r="1." g="0." b="0." alpha=".9" at="0." /> @@ -266,7 +266,7 @@ <ShowMinimum value="false" /> <Background> <Image> - <Graphic category="" author="wrtlprnft" version="1" name="gauge_horizontal_filled" uri="http://wrtlprnft.ath.cx/gauge_horizontal_filled.png" /> + <Graphic author="wrtlprnft" version="1" name="gauge_horizontal_filled" uri="http://wrtlprnft.ath.cx/gauge_horizontal_filled.png" /> </Image> <Solid> <Color r="1." g="0." b="0." alpha="1." /> @@ -274,7 +274,7 @@ </Background> <Foreground> <Image> - <Graphic category="" author="wrtlprnft" version="1" name="gauge_horizontal_filled" uri="http://wrtlprnft.ath.cx/gauge_horizontal_filled.png" /> + <Graphic author="wrtlprnft" version="1" name="gauge_horizontal_filled" uri="http://wrtlprnft.ath.cx/gauge_horizontal_filled.png" /> </Image> <Solid> <Color r="0." g="1." b="0." alpha="1." /> @@ -286,7 +286,7 @@ <Size height="0.25" width="0.25" /> <Background> <Image scale_x=".075" scale_y=".075" repeat="both"> - <Graphic category="" author="wrtlprnft" version="1" name="floor" extension="png" uri="http://wrtlprnft.ath.cx/floor.png" /> + <Graphic author="wrtlprnft" version="1" name="floor" extension="png" uri="http://wrtlprnft.ath.cx/floor.png" /> </Image> <Solid> <Color r=".5" g="1." b=".5" alpha="1." /> Modified: armagetronad/trunk/armagetronad/resource/proto/cockpit.dtd =================================================================== --- armagetronad/trunk/armagetronad/resource/proto/cockpit.dtd 2008-02-13 17:26:55 UTC (rev 7908) +++ armagetronad/trunk/armagetronad/resource/proto/cockpit.dtd 2008-02-13 23:06:45 UTC (rev 7909) @@ -175,9 +175,9 @@ <!ELEMENT Graphic EMPTY> <!ATTLIST Graphic name CDATA #REQUIRED - author CDATA 'Anonymous' + author CDATA #IMPLIED version CDATA #REQUIRED - category CDATA 'unsorted' + category CDATA #IMPLIED extension CDATA 'png' uri CDATA "" > Modified: armagetronad/trunk/armagetronad/src/tools/tResourceManager.h =================================================================== --- armagetronad/trunk/armagetronad/src/tools/tResourceManager.h 2008-02-13 17:26:55 UTC (rev 7908) +++ armagetronad/trunk/armagetronad/src/tools/tResourceManager.h 2008-02-13 23:06:45 UTC (rev 7909) @@ -66,6 +66,11 @@ tString const &URI () const {return m_URI ;} //!< get the URI to the file, if any tString const &Path () const {return m_Path ;} //!< get the full path of the resource + bool Valid() const {return !m_Path.empty();} //!< is this a valid resource path? + + //! default constructor. Valid() will return false if called on an object constructed this way. + tResourcePath(){} + //! construct the path from the given arguments tResourcePath(tString const &Author, tString const &Category, Modified: armagetronad/trunk/armagetronad/src/tools/tXmlParser.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tools/tXmlParser.cpp 2008-02-13 17:26:55 UTC (rev 7908) +++ armagetronad/trunk/armagetronad/src/tools/tXmlParser.cpp 2008-02-13 23:06:45 UTC (rev 7909) @@ -336,17 +336,6 @@ return true; } -// gets a path segment from a string, appending a "/" if none is there and the path is not empty -static tString st_GetPathSegment( tString const &segment ) -{ - tString ret(segment); - - if ( ret.Size() > 0 && ret[ ret.Size()-1 ] != '/' ) - ret += '/'; - - return ret; -} - #ifndef DEDICATED static tString st_errorLeadIn(""); @@ -477,19 +466,16 @@ con << "Empty document\n"; return false; } else if (root.IsOfType("Resource")) { - m_Author = root.GetProp("author"); - m_Category = root.GetProp("category"); - m_Name = root.GetProp("name"); - m_Version = root.GetProp("version"); - m_Type = root.GetProp("type"); - tString rightFilepath = st_GetPathSegment(m_Author); - rightFilepath << st_GetPathSegment(m_Category) - << m_Name << "-" - << m_Version << "." - << m_Type << ".xml"; - - /* remove extra double // */ - + m_Path = tResourcePath ( + root.GetProp("author"), + root.GetProp("category"), + root.GetProp("name"), + root.GetProp("version"), + root.GetProp("type"), + tString("xml"), + tString("") + ); + tString rightFilepath( m_Path.Path() ); tString pureFilepath( filepath ); int paren = pureFilepath.StrPos( "(" ); if ( paren > 0 ) @@ -548,6 +534,16 @@ return tString(reinterpret_cast<const char *>(m_cur->name)); } +//! @param prop The name of the property to be checked +//! @returns true if the property exists +bool tXmlParser::node::HasProp(CHAR const *prop) const { + tASSERT(m_cur); + return xmlHasProp(m_cur, + reinterpret_cast<const xmlChar *> + (prop) + ); +} + //! This function prints a warning if the attribute doesn't exist //! @param prop The name of the attribute to be read //! @returns The property as a string Modified: armagetronad/trunk/armagetronad/src/tools/tXmlParser.h =================================================================== --- armagetronad/trunk/armagetronad/src/tools/tXmlParser.h 2008-02-13 17:26:55 UTC (rev 7908) +++ armagetronad/trunk/armagetronad/src/tools/tXmlParser.h 2008-02-13 23:06:45 UTC (rev 7909) @@ -38,6 +38,7 @@ #include "tString.h" #include "tError.h" #include "tConsole.h" +#include "tResourceManager.h" #include <map> #include <typeinfo> @@ -59,6 +60,7 @@ node() : m_cur(0) {} //!< Dummy constructor, only of use for stl containers bool IsOfType(CHAR const *name) const; //!< Checks the type (name) of a node tString GetName(void) const; //!< Gets the type (name) of the node + bool HasProp(CHAR const *prop) const; //!< Check if a property of the given name exists tString GetProp(CHAR const *prop) const; //!< Get a property of this node as a raw string bool GetPropBool(CHAR const *prop) const; //!< Get a boolean value out of a property #ifndef _MSC_VER @@ -71,6 +73,7 @@ #endif bool IsOfType(tString const &name) const { return IsOfType(name.c_str());} //!< Checks the type (name) of a node + bool HasProp(tString const &prop) const { return HasProp(prop.c_str()); } //!< Check if a property of the given name exists tString GetProp(tString const &prop) const { return GetProp(prop.c_str()); } //!< Get a property of this node as a raw string bool GetPropBool(tString const &prop) const { return GetPropBool(prop.c_str()); } //!< Get a boolean value out of a property template<typename T> void GetProp(tString const &prop, T &target) const {GetProp(prop.c_str(), target);} //!< Get a property, convert to any type @@ -141,13 +144,10 @@ class tXmlResource : public tXmlParser { public: bool LoadFile(const char* filename, const char* uri=""); + tResourcePath const &Path() const {return m_Path;} //!< get the resource path this file was loaded from protected: bool ValidateXml(FILE* docfd, const char* uri, const char* filepath); - tString m_Author; //!< the author of the resource - tString m_Category; //!< the category of the resource - tString m_Name; //!< the name of the resource - tString m_Version; //!< the version of the resource - tString m_Type; //!< the type of the resource + tResourcePath m_Path; //!< the resource identifier of this resource node GetFileContents(void); //!< Returns the node the "real" file contents are within }; Modified: armagetronad/trunk/armagetronad/src/tron/cockpit/cCockpit.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/cockpit/cCockpit.cpp 2008-02-13 17:26:55 UTC (rev 7908) +++ armagetronad/trunk/armagetronad/src/tron/cockpit/cCockpit.cpp 2008-02-13 23:06:45 UTC (rev 7909) @@ -423,7 +423,7 @@ if(!cur) { tERR_WARN("No Cockpit node found!"); } - if (tXmlResource::m_Type != "aacockpit") { + if (m_Path.Type() != "aacockpit") { tERR_WARN("Type 'aacockpit' expected, found '" << cur.GetProp("type") << "' instead"); return; } Modified: armagetronad/trunk/armagetronad/src/tron/cockpit/cCockpit.h =================================================================== --- armagetronad/trunk/armagetronad/src/tron/cockpit/cCockpit.h 2008-02-13 17:26:55 UTC (rev 7908) +++ armagetronad/trunk/armagetronad/src/tron/cockpit/cCockpit.h 2008-02-13 23:06:45 UTC (rev 7909) @@ -58,7 +58,7 @@ class gCycle; //! Cockpit class: keeps a list of widgets and delegates rendering and parsing to them -class cCockpit : private tXmlResource, public eCockpitPrototype { +class cCockpit : public tXmlResource, public eCockpitPrototype { static std::list<cCockpit *> m_Cockpits; public: static std::list<cCockpit *> const &Cockpits() {return m_Cockpits;} Modified: armagetronad/trunk/armagetronad/src/tron/cockpit/cWidgetBase.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/cockpit/cWidgetBase.cpp 2008-02-13 17:26:55 UTC (rev 7908) +++ armagetronad/trunk/armagetronad/src/tron/cockpit/cWidgetBase.cpp 2008-02-13 23:06:45 UTC (rev 7909) @@ -439,8 +439,8 @@ for(cur = cur.GetFirstChild(); cur; ++cur) { if(cur.IsOfType("Graphic")) { tResourcePath path( - cur.GetProp("author"), - cur.GetProp("category"), + cur.HasProp("author") ? cur.GetProp("author") : m_Cockpit->Path().Author(), + cur.HasProp("category") ? cur.GetProp("category") : m_Cockpit->Path().Category(), cur.GetProp("name"), cur.GetProp("version"), tString("aatex"), This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <z-...@us...> - 2008-02-14 00:40:45
|
Revision: 7914 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7914&view=rev Author: z-man Date: 2008-02-13 16:40:50 -0800 (Wed, 13 Feb 2008) Log Message: ----------- Merging branch 0.2.8 from revision 7838 to 7911: ------------------------------------------------------------------------ r7911 | bazaarmagetron | 2008-02-14 00:31:45 +0100 (Thu, 14 Feb 2008) | 2 lines Manuel Moos: Updated. ------------------------------------------------------------------------ r7910 | bazaarmagetron | 2008-02-14 00:31:09 +0100 (Thu, 14 Feb 2008) | 2 lines Manuel Moos: Spectators can now send spectator-only chat with /team (unless they are silenced, of course.) ------------------------------------------------------------------------ r7902 | bazaarmagetron | 2008-02-13 15:25:19 +0100 (Wed, 13 Feb 2008) | 2 lines Manuel Moos: Two more (redundant) fixes for the CASACL problem. ------------------------------------------------------------------------ r7901 | bazaarmagetron | 2008-02-13 13:16:06 +0100 (Wed, 13 Feb 2008) | 2 lines Manuel Moos: Fixed spurious display list regeneration on alpha blending changes. ------------------------------------------------------------------------ r7900 | bazaarmagetron | 2008-02-13 10:27:23 +0100 (Wed, 13 Feb 2008) | 2 lines Manuel Moos: Slightly less braindead way of keeping cycle walls rendered after the cycle died. ------------------------------------------------------------------------ r7899 | bazaarmagetron | 2008-02-13 02:03:26 +0100 (Wed, 13 Feb 2008) | 2 lines Manuel Moos: Initializing initial color in all constructors. ------------------------------------------------------------------------ r7898 | bazaarmagetron | 2008-02-13 02:01:49 +0100 (Wed, 13 Feb 2008) | 1 line Manuel Moos: Disabling points at really infinite distance when display lists are recorded. Looks like the NVidia Linux driver can't handle them. ------------------------------------------------------------------------ r7897 | bazaarmagetron | 2008-02-13 01:06:29 +0100 (Wed, 13 Feb 2008) | 2 lines Manuel Moos: Restored floor mirroring and repaired jagged lines on bottom of zones. ------------------------------------------------------------------------ r7896 | bazaarmagetron | 2008-02-12 23:56:51 +0100 (Tue, 12 Feb 2008) | 2 lines Manuel Moos: Display lists for zones, too. (not merged) ------------------------------------------------------------------------ r7895 | bazaarmagetron | 2008-02-12 22:58:26 +0100 (Tue, 12 Feb 2008) | 17 lines author: Manuel Moos Automatic merging of commits that would change history order: ------------------------------------------------------------ revno: 602.1.2 committer: wrtlprnft <wrt...@us...> branch nick: 0.2.8 timestamp: Tue 2008-02-12 22:49:34 +0100 message: err, this is a commit after bzr merge, no clue what to put here ------------------------------------------------------------ revno: 602.1.1 committer: wrtlprnft <wrt...@us...> branch nick: 0.2.8 timestamp: Tue 2008-02-12 22:46:20 +0100 message: Fixed two bugs regarding CASACL ------------------------------------------------------------------------ r7894 | bazaarmagetron | 2008-02-12 22:51:24 +0100 (Tue, 12 Feb 2008) | 2 lines Manuel Moos: Bye, bye, Z-Trick. It was nice while it lasted. *sniff* ------------------------------------------------------------------------ r7893 | bazaarmagetron | 2008-02-12 22:34:41 +0100 (Tue, 12 Feb 2008) | 2 lines Manuel Moos: Fixed Create-and-Call playlist mode. ------------------------------------------------------------------------ r7891 | bazaarmagetron | 2008-02-12 16:55:13 +0100 (Tue, 12 Feb 2008) | 2 lines Manuel Moos: More bugfixing helpers. ------------------------------------------------------------------------ r7890 | bazaarmagetron | 2008-02-12 16:53:43 +0100 (Tue, 12 Feb 2008) | 2 lines Manuel Moos: Disabling wall "shadows" when display lists are used for them. Let's see if we can find something smarter. ------------------------------------------------------------------------ r7889 | bazaarmagetron | 2008-02-12 16:52:02 +0100 (Tue, 12 Feb 2008) | 2 lines Manuel Moos: Fixed wall flickering. ------------------------------------------------------------------------ r7888 | bazaarmagetron | 2008-02-12 15:22:54 +0100 (Tue, 12 Feb 2008) | 2 lines Manuel Moos: More debug checks. ------------------------------------------------------------------------ r7887 | bazaarmagetron | 2008-02-12 15:22:06 +0100 (Tue, 12 Feb 2008) | 2 lines Manuel Moos: Fixed another OpenGL usage bug, the white background was rendered without starting a new Quad block. ------------------------------------------------------------------------ r7886 | bazaarmagetron | 2008-02-12 15:21:31 +0100 (Tue, 12 Feb 2008) | 2 lines Manuel Moos: Fixed unitialized variable bugs. ------------------------------------------------------------------------ r7885 | bazaarmagetron | 2008-02-12 15:20:51 +0100 (Tue, 12 Feb 2008) | 2 lines Manuel Moos: Disabled support for antialiasing and perspective correction settings. Antialiasing never worked properly anyway, and disabling perspective correction is just stupid :) ------------------------------------------------------------------------ r7884 | bazaarmagetron | 2008-02-12 13:45:29 +0100 (Tue, 12 Feb 2008) | 2 lines Manuel Moos: Fixed wall display list generation some more. ------------------------------------------------------------------------ r7883 | bazaarmagetron | 2008-02-12 13:05:33 +0100 (Tue, 12 Feb 2008) | 2 lines Manuel Moos: Fixed GL errors and fixed the generation of the player wall collective display list; every wall there was rendered twice and with suboptimal primitive order :) ------------------------------------------------------------------------ r7882 | bazaarmagetron | 2008-02-12 12:42:06 +0100 (Tue, 12 Feb 2008) | 2 lines Manuel Moos: Server compatibility. ------------------------------------------------------------------------ r7881 | bazaarmagetron | 2008-02-12 12:40:28 +0100 (Tue, 12 Feb 2008) | 2 lines Manuel Moos: Better usage of preprocessor conditionals. ------------------------------------------------------------------------ r7880 | bazaarmagetron | 2008-02-12 12:21:22 +0100 (Tue, 12 Feb 2008) | 2 lines Manuel Moos: Backported OpenGL error dedection code from the trunk. ------------------------------------------------------------------------ r7879 | bazaarmagetron | 2008-02-12 02:42:29 +0100 (Tue, 12 Feb 2008) | 2 lines Manuel Moos: Last one for today: removing walls that are really dead and vanished from the rendering list. ------------------------------------------------------------------------ r7878 | bazaarmagetron | 2008-02-12 02:00:39 +0100 (Tue, 12 Feb 2008) | 2 lines Manuel Moos: Removing expired walls from render list. ------------------------------------------------------------------------ r7877 | bazaarmagetron | 2008-02-12 01:59:52 +0100 (Tue, 12 Feb 2008) | 2 lines Manuel Moos: Added display list statistics. ------------------------------------------------------------------------ r7876 | bazaarmagetron | 2008-02-12 01:59:18 +0100 (Tue, 12 Feb 2008) | 2 lines Manuel Moos: Avoiding mode changes for cycle walls, too. ------------------------------------------------------------------------ r7875 | bazaarmagetron | 2008-02-12 01:30:11 +0100 (Tue, 12 Feb 2008) | 2 lines Manuel Moos: Avoiding more mode switches. ------------------------------------------------------------------------ r7874 | bazaarmagetron | 2008-02-12 01:29:40 +0100 (Tue, 12 Feb 2008) | 2 lines Manuel Moos: Made the display list menu a threefold choice: off, create and call, create and execute. ------------------------------------------------------------------------ r7873 | bazaarmagetron | 2008-02-12 01:28:37 +0100 (Tue, 12 Feb 2008) | 2 lines Manuel Moos: Avoiding mode changes. ------------------------------------------------------------------------ r7872 | bazaarmagetron | 2008-02-12 01:27:59 +0100 (Tue, 12 Feb 2008) | 2 lines Manuel Moos: Using a single glBegin(GL_QUADS) block for all rim walls now. ------------------------------------------------------------------------ r7871 | bazaarmagetron | 2008-02-12 01:27:09 +0100 (Tue, 12 Feb 2008) | 2 lines Manuel Moos: Fixed cycle memory leaks. ------------------------------------------------------------------------ r7870 | bazaarmagetron | 2008-02-11 23:20:11 +0100 (Mon, 11 Feb 2008) | 2 lines wrtlprnft: Fixed color overflow in the configuration change message (hi there K-Yo!). I hope z-man doesn't rip my head off for removing yet another color code related bug that he can use as proof that color codes aren't officially supported (they're still not!) ------------------------------------------------------------------------ r7868 | bazaarmagetron | 2008-02-11 21:17:40 +0100 (Mon, 11 Feb 2008) | 2 lines Manuel Moos: And another server fix. ------------------------------------------------------------------------ r7867 | bazaarmagetron | 2008-02-11 21:15:57 +0100 (Mon, 11 Feb 2008) | 2 lines Manuel Moos: And again: Server compilation fixes. ------------------------------------------------------------------------ r7866 | bazaarmagetron | 2008-02-11 21:09:24 +0100 (Mon, 11 Feb 2008) | 2 lines Manuel Moos: Added flag to first compile the display lists, then execute them, instead of using GL_COMPILE_AND_EXECUTE. For expermients. ------------------------------------------------------------------------ r7865 | bazaarmagetron | 2008-02-11 20:45:01 +0100 (Mon, 11 Feb 2008) | 5 lines author: Manuel Moos Fixed two bugs from the new display list code: - walls that were updated on server order did not update the display list - walls of players who quit a server would get invisible. ------------------------------------------------------------------------ r7864 | bazaarmagetron | 2008-02-11 17:08:17 +0100 (Mon, 11 Feb 2008) | 2 lines Manuel Moos: Fixed performance bug, cycle wall display list was deleted too often. ------------------------------------------------------------------------ r7863 | bazaarmagetron | 2008-02-11 16:52:57 +0100 (Mon, 11 Feb 2008) | 2 lines Manuel Moos: Even better server compatibility. ------------------------------------------------------------------------ r7862 | bazaarmagetron | 2008-02-11 16:52:13 +0100 (Mon, 11 Feb 2008) | 2 lines Manuel Moos: Dedicated server compatibility, again. ------------------------------------------------------------------------ r7861 | bazaarmagetron | 2008-02-11 16:51:43 +0100 (Mon, 11 Feb 2008) | 2 lines Manuel Moos: Static player walls now also get a display list. ------------------------------------------------------------------------ r7860 | bazaarmagetron | 2008-02-11 16:22:47 +0100 (Mon, 11 Feb 2008) | 2 lines Manuel Moos: Server compatibility restored. ------------------------------------------------------------------------ r7858 | bazaarmagetron | 2008-02-11 15:08:54 +0100 (Mon, 11 Feb 2008) | 4 lines author: Manuel Moos Added display list wrapper for convenient caching of renderings. Used it for the console and individual cycle walls. ------------------------------------------------------------------------ r7856 | bazaarmagetron | 2008-02-11 12:34:46 +0100 (Mon, 11 Feb 2008) | 2 lines Manuel Moos: Hmm, odd rendering height bug for the rim walls. It seems the code renders them wrongly the first time around. Oh well, let's just create the display list some frames into the round :) ------------------------------------------------------------------------ r7855 | bazaarmagetron | 2008-02-11 12:02:27 +0100 (Mon, 11 Feb 2008) | 2 lines Manuel Moos: Still more performance: putting all rim walls into one display list (as long as they are not lowered for rendering). ------------------------------------------------------------------------ r7854 | bazaarmagetron | 2008-02-11 10:36:47 +0100 (Mon, 11 Feb 2008) | 2 lines Manuel Moos: Disabling backface culling for cycle walls. ------------------------------------------------------------------------ r7853 | bazaarmagetron | 2008-02-11 10:36:16 +0100 (Mon, 11 Feb 2008) | 2 lines Manuel Moos: Avoiding state changes when rendering rim walls (at least, when no moviepack is selected). ------------------------------------------------------------------------ r7852 | bazaarmagetron | 2008-02-11 09:53:45 +0100 (Mon, 11 Feb 2008) | 2 lines Manuel Moos: Performance improvement: the cycle now triggers rendering of its walls, the renderer does not have to traverse all walls (and render them multiple times). ------------------------------------------------------------------------ r7848 | bazaarmagetron | 2008-02-10 22:27:14 +0100 (Sun, 10 Feb 2008) | 2 lines Manuel Moos: Merged memory leak fix from Pig Sty Branch. ------------------------------------------------------------------------ r7842 | bazaarmagetron | 2008-02-10 15:53:47 +0100 (Sun, 10 Feb 2008) | 2 lines Fixed a mixup where the menu item labels for hiding your global id and spectator mode were swapped ------------------------------------------------------------------------ Revision Links: -------------- http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7838&view=rev Modified Paths: -------------- armagetronad/trunk/armagetronad/NEWS armagetronad/trunk/armagetronad/language/english_base.txt armagetronad/trunk/armagetronad/src/Makefile.am armagetronad/trunk/armagetronad/src/engine/eAdvWall.cpp armagetronad/trunk/armagetronad/src/engine/eAdvWall.h armagetronad/trunk/armagetronad/src/engine/eDisplay.cpp armagetronad/trunk/armagetronad/src/engine/eGameObject.h armagetronad/trunk/armagetronad/src/engine/eGrid.cpp armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp armagetronad/trunk/armagetronad/src/engine/eTeam.cpp armagetronad/trunk/armagetronad/src/engine/eWall.cpp armagetronad/trunk/armagetronad/src/network/nNetwork.cpp armagetronad/trunk/armagetronad/src/render/rConsoleGraph.cpp armagetronad/trunk/armagetronad/src/render/rGL.cpp armagetronad/trunk/armagetronad/src/render/rGL.h armagetronad/trunk/armagetronad/src/render/rGLRender.cpp armagetronad/trunk/armagetronad/src/render/rModel.cpp armagetronad/trunk/armagetronad/src/render/rModel.h armagetronad/trunk/armagetronad/src/render/rRender.h armagetronad/trunk/armagetronad/src/render/rScreen.cpp armagetronad/trunk/armagetronad/src/render/rScreen.h armagetronad/trunk/armagetronad/src/tools/tConfiguration.cpp armagetronad/trunk/armagetronad/src/tools/tLinkedList.h armagetronad/trunk/armagetronad/src/tron/gCycle.cpp armagetronad/trunk/armagetronad/src/tron/gCycle.h armagetronad/trunk/armagetronad/src/tron/gGame.cpp armagetronad/trunk/armagetronad/src/tron/gMenus.cpp armagetronad/trunk/armagetronad/src/tron/gStuff.cpp armagetronad/trunk/armagetronad/src/tron/gWall.cpp armagetronad/trunk/armagetronad/src/tron/gWall.h Added Paths: ----------- armagetronad/trunk/armagetronad/src/render/rDisplayList.cpp armagetronad/trunk/armagetronad/src/render/rDisplayList.h Removed Paths: ------------- armagetronad/trunk/armagetronad/src/doc/COPYING.txt Modified: armagetronad/trunk/armagetronad/NEWS =================================================================== --- armagetronad/trunk/armagetronad/NEWS 2008-02-14 00:08:32 UTC (rev 7913) +++ armagetronad/trunk/armagetronad/NEWS 2008-02-14 00:40:50 UTC (rev 7914) @@ -166,6 +166,10 @@ ----------- - /teams chat command that rougly prints team layout. +- /team messages can be used by spectators to chat with other spectators only. +- Performance optimizations. Using OpenGL display lists to cache geometry. +- Removed ztrick, antialiasing and perspective correction settings. They all had only one right + setting and caused us some interesting bug reports. - Added PLAYER_RANDOM_COLOR for lazy people who just want to have a color that differs from everyone else on the server. - Configuration files get reloaded on SIGHUP Modified: armagetronad/trunk/armagetronad/language/english_base.txt =================================================================== --- armagetronad/trunk/armagetronad/language/english_base.txt 2008-02-14 00:08:32 UTC (rev 7913) +++ armagetronad/trunk/armagetronad/language/english_base.txt 2008-02-14 00:40:50 UTC (rev 7914) @@ -650,7 +650,6 @@ swapmode_glfinish_help Calls glFinish() to sync graphics output. This is guaranteed to prevent graphics lagging behind input, but causes loss of framerate on some systems and full CPU load on others. Use if Flush does not work. swap_mode_help Determines the commands used to sync graphics and input. 0: do nothing, 1: call glFlush(), 2: call glFinish(). -ztrick_help Performance tweak; does not work on most Windows systems texture_mode_0_help Floor Texture: texture_mode_1_help Wall Textures: texture_mode_2_help Object Textures: @@ -660,9 +659,6 @@ gl_version_help OpenGL system information gl_renderer_help OpenGL system information gl_vendor_help OpenGL system information -line_antialias_help Enable line antialiasing -poly_antialias_help Enable polygon antialiasing -persp_correct_help Enable perspective correction alpha_blend_help Enable alpha blending zone_alpha_toggle_help This is XORd with ALPHA_BLEND to determine the way to draw zones smooth_shading_help Enable smooth shading @@ -1611,11 +1607,11 @@ player_autologin_text Auto Login: player_autologin_help When enabled, you will automatically initiate the (usually completely optional) login procedure as soon as you enter a server. -player_spectator_text Hide Global ID: -player_spectator_help Usually your global ID is shown to everyone when you log in or when someone uses the /players chat command. Enabling this tells the server that you prefer to remain anonymous. The server may still show your ID to moderators and administrators on the server or even decide to ignore your request. +player_stealth_text Hide Global ID: +player_stealth_help Usually your global ID is shown to everyone when you log in or when someone uses the /players chat command. Enabling this tells the server that you prefer to remain anonymous. The server may still show your ID to moderators and administrators on the server or even decide to ignore your request. -player_stealth_text Spectator Mode: -player_stealth_help In spectator mode, you do not control a cycle; you just watch the game as if you were already dead. The other players will see you on the score table and you can chat with them, but you won't be spawned at the beginng of a round. +player_spectator_text Spectator Mode: +player_spectator_help In spectator mode, you do not control a cycle; you just watch the game as if you were already dead. The other players will see you on the score table and you can chat with them, but you won't be spawned at the beginng of a round. player_name_team_text Name Team after Player: player_name_team_help You can set your prefered method for naming your team here: On indicates you want the team to be named after its most senior player, Off means you want a simple colour label. @@ -1935,21 +1931,12 @@ detail_floor_2tex_text Dual Texture Plane detail_floor_2tex_help Just as in "Textured Plane", the floor is an infinite textured plane. But here, the two groups of lines are drawn in two separate rendering steps, resulting in a much sharper image. -detail_polyantialias_text Polygon Antial.: -detail_polyantialias_help Shall the contours of objects be smoothed to avoid ugly pixel stairs? Not implemented on most systems. - -detail_lineantialias_text Line Antialiasing: -detail_lineantialias_help Should lines be smoothed to avoid pixel stairs? - detail_alpha_text Alpha Blending: detail_alpha_help Alpha blending is used to display half-transparent objects such as explosions and the walls rising behind the cycles. It does not cost extra with most 3D-cards, but slows software rendering down quite a bit. detail_smooth_text Smooth Shading: detail_smooth_help Makes edges appear "round" by adding a colour gradient to the surfaces. Even software rendering is not slowed down by activating this. -detail_persp_text Persp. Correction: -detail_persp_help Most renderers ignore this feature; if really turned off, the wall and floor textures will be displayed horribly deformed. I really don't know why I let you choose this... :) - detail_text_truecolor_text TrueColour Textures: detail_text_truecolor_help Stores the textures with 32 bit colour depth instead of the default of 16 bit. @@ -2010,11 +1997,14 @@ #tweaks menu tweaks_displaylists_text Display Lists: -tweaks_displaylists_help Display lists are a feature of OpenGL for rendering the same thing many times; it is normally used for the cycles. Some implementations are broken however; if you do no see the cycles, you should disable this feature. +tweaks_displaylists_help Display lists are a feature of OpenGL for rendering the same thing many times; it is normally used for the cycles and other geometry. Some implementations are broken however; if you do no see the cycles, you should disable this feature. +tweaks_displaylists_off_text Off +tweaks_displaylists_off_help Don't use display lists at all. +tweaks_displaylists_cac_text Create and Call +tweaks_displaylists_cac_help Use displaylists; Create them and call them directly. This is the recommended way. +tweaks_displaylists_cae_text Create and Execute +tweaks_displaylists_cae_help Use displaylists; Create them let them be executed while they are filled. The expers say this is slower than Create and Call. -tweaks_ztrick_text ZTrick: -tweaks_ztrick_help A speedup that probably only works on old 3dfx cards: instead of clearing the screen after each frame, we just draw the backgroud (floor and rim walls). - tweaks_infinity_text Infinity: tweaks_infinity_help Some planes (grid, sky...) have an infinite extension; if this feature is enabled, they are really drawn as infinite planes. Some OpenGL renderers do not seem to like this (all Windows versions I have seen...); disable it if the floor or sky textures are screwed up. @@ -2249,6 +2239,8 @@ player_nojoin_team \1 cannot currently join \2.\n player_not_on_team You are not on a team.\n team_renamed \1 renamed its team to \2.\n +player_team_message Teammates +player_spectator_message Spectators no_real_teams No teams with more than one player.\n player_topologypolice Order from Topology Police: \1 @@ -2583,7 +2575,7 @@ access_level_error Required access level of command \1 is "\2", you only have "\3".\n casacl_help For the duratioon of the rest of the configuration file thiss directive appears in, elevate the access level. -casacl_usage Usage: CASACL <required access levell> <elevated access level>\n +casacl_usage Usage: CASACL <required access level> <elevated access level>\n abort_loading_name Loading Abort abort_loading_description Current config file/stream loading was aborted by command \1. Modified: armagetronad/trunk/armagetronad/src/Makefile.am =================================================================== --- armagetronad/trunk/armagetronad/src/Makefile.am 2008-02-14 00:08:32 UTC (rev 7913) +++ armagetronad/trunk/armagetronad/src/Makefile.am 2008-02-14 00:40:50 UTC (rev 7914) @@ -124,6 +124,7 @@ librender_a_SOURCES=render/rConsole.cpp render/rConsoleGraph.cpp render/rConsole.h render/rFont.cpp\ render/rFont.h render/rGL.cpp render/rGL.h render/rGLEW.h render/rGLRender.cpp render/rModel.cpp render/rModel.h render/rRender.cpp\ + render/rDisplayList.h render/rDisplayList.cpp \ render/rRender.h render/rScreen.cpp render/rScreen.h render/rSDL.h render/rSysdep.cpp render/rSysdep.h\ render/rTexture.cpp render/rTexture.h render/rViewport.cpp render/rViewport.h render/rColor.h render/rGradient.cpp render/rGradient.h \ render/rTextureRenderTarget.cpp render/rTextureRenderTarget.h render/rGLuintObject.cpp render/rGLuintObject.h Deleted: armagetronad/trunk/armagetronad/src/doc/COPYING.txt =================================================================== --- armagetronad/trunk/armagetronad/src/doc/COPYING.txt 2008-02-14 00:08:32 UTC (rev 7913) +++ armagetronad/trunk/armagetronad/src/doc/COPYING.txt 2008-02-14 00:40:50 UTC (rev 7914) @@ -1,340 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - <signature of Ty Coon>, 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. Modified: armagetronad/trunk/armagetronad/src/engine/eAdvWall.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/engine/eAdvWall.cpp 2008-02-14 00:08:32 UTC (rev 7913) +++ armagetronad/trunk/armagetronad/src/engine/eAdvWall.cpp 2008-02-14 00:40:50 UTC (rev 7914) @@ -28,12 +28,14 @@ #include "eWall.h" #include "math.h" #include "rTexture.h" +#include "rDisplayList.h" #include "eTimer.h" #include "rScreen.h" #include "eAdvWall.h" #include "eCamera.h" #include "tConfiguration.h" #include "eRectangle.h" +#include "rRender.h" #include <vector> @@ -52,11 +54,13 @@ // if(bf_cull && sr_ZTrick) se_rimWalls.Add(this,rim_id); -} + DestroyDisplayList();} + eWallRim::~eWallRim() { se_rimWalls.Remove(this,rim_id); + DestroyDisplayList(); } //ArmageTron_eWalltype gWallRim::type(){return ArmageTron_RIM;} @@ -111,8 +115,71 @@ return se_OffsetBounds( offset ).Contains( x ); } +#ifndef DEDICATED +static rDisplayList se_rimDisplayList; + +extern bool sg_MoviePack(); + +static bool se_RimWrapY=true; +static tSettingItem<bool> se_RimWrapYConf +("RIM_WALL_WRAP_Y",se_RimWrapY); + +static rFileTexture se_RimWallNoWrap(rTextureGroups::TEX_WALL,"textures/rim_wall.png",1,0); +static rFileTexture se_RimWallWrap(rTextureGroups::TEX_WALL,"textures/rim_wall.png",1,1); + +#endif + // ******************************************************************************************* // * +// * RenderAll +// * +// ******************************************************************************************* +//! @param camera camera used for rendering +// ******************************************************************************************* +void eWallRim::RenderAll( eCamera * camera ) +{ +#ifndef DEDICATED + // call or fill display list + if ( se_rimDisplayList.Call() ) + { + return; + } + rDisplayListFiller filler( se_rimDisplayList ); + + glEnable(GL_DEPTH_TEST); + glDisable(GL_CULL_FACE); + + if ( !sg_MoviePack() ) + { + ( se_RimWrapY ? se_RimWallWrap : se_RimWallNoWrap).Select(); + } + + BeginQuads(); + for(int i=se_rimWalls.Len()-1;i>=0;i--){ + se_rimWalls(i)->RenderReal( rDisplayList::IsRecording() ? 0 : camera ); + } + RenderEnd(); + + glEnable(GL_CULL_FACE); +#endif +} + +// ******************************************************************************************* +// * +// * DestroyDisplayList +// * +// ******************************************************************************************* +void eWallRim::DestroyDisplayList() +{ +#ifndef DEDICATED + se_rimDisplayList.Clear( 3 ); +#endif +} + +static rCallbackBeforeScreenModeChange unload(&eWallRim::DestroyDisplayList); + +// ******************************************************************************************* +// * // * Clip // * // ******************************************************************************************* Modified: armagetronad/trunk/armagetronad/src/engine/eAdvWall.h =================================================================== --- armagetronad/trunk/armagetronad/src/engine/eAdvWall.h 2008-02-14 00:08:32 UTC (rev 7913) +++ armagetronad/trunk/armagetronad/src/engine/eAdvWall.h 2008-02-14 00:40:50 UTC (rev 7914) @@ -45,7 +45,6 @@ virtual bool Splittable() const; - // virtual void Split(eWall *& w1,eWall *& w2,REAL a); #ifndef DEDICATED @@ -57,7 +56,7 @@ } #endif -virtual REAL Height() const{return height;} + virtual REAL Height() const{return height;} virtual REAL SeeHeight() const{return height*40;} @@ -70,6 +69,11 @@ //! is x by offset inside the bounds of the rim eWalls? static bool IsBound(const eCoord &x,REAL offset=0); + + //! renders all rim walls + static void RenderAll( eCamera * camera ); + //! destroys the display list (call when geometry is updated) + static void DestroyDisplayList(); //! brings x into the bounds of the rim eWalls with a min distance of offset static REAL Bound(eCoord &x,REAL offset=0); //! brings out inside the bounds of the rim walls, moving it closer to in. Modified: armagetronad/trunk/armagetronad/src/engine/eDisplay.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/engine/eDisplay.cpp 2008-02-14 00:08:32 UTC (rev 7913) +++ armagetronad/trunk/armagetronad/src/engine/eDisplay.cpp 2008-02-14 00:40:50 UTC (rev 7914) @@ -123,8 +123,6 @@ } static void infinity_xy_plane(eCoord const & pos, const eCoord &dir,REAL h=0){ - glEdgeFlag(GL_FALSE); - bool use_rim=false; REAL zero=0; @@ -325,9 +323,8 @@ */ - glEdgeFlag(GL_FALSE); - glDisable(GL_DEPTH_TEST); + glDepthMask(GL_FALSE); glDisable(GL_CULL_FACE); @@ -365,6 +362,8 @@ } if (floor){ + sr_DepthOffset(false); + su_FetchAndStoreSDLInput(); int floorDetail = sr_floorDetail; @@ -467,6 +466,9 @@ } } + glEnable(GL_DEPTH_TEST); + glDepthMask(GL_TRUE); + TexMatrix(); glLoadIdentity(); ModelMatrix(); @@ -476,12 +478,11 @@ // glDisable(GL_TEXTURE_GEN_Q); // glDisable(GL_TEXTURE_GEN_R); - glEnable(GL_DEPTH_TEST); - if(eWalls){ - for(int i=se_rimWalls.Len()-1;i>=0;i--){ + { su_FetchAndStoreSDLInput(); - se_rimWalls(i)->RenderReal(cameras(viewer)); + + eWallRim::RenderAll( cameras(viewer) ); } if (sr_lowerSky && sr_highRim){ @@ -501,17 +502,13 @@ glLoadIdentity(); ModelMatrix(); } - - glEnable(GL_DEPTH_TEST); } - else - glEnable(GL_DEPTH_TEST); sr_CheckGLError(); if (eWalls){ - glDisable(GL_CULL_FACE); - draw_eWall(this,viewer,0,zNear,cameras(viewer)); + // glDisable(GL_CULL_FACE); + // draw_eWall(this,viewer,0,zNear,cameras(viewer)); /* #ifdef DEBUG Modified: armagetronad/trunk/armagetronad/src/engine/eGameObject.h =================================================================== --- armagetronad/trunk/armagetronad/src/engine/eGameObject.h 2008-02-14 00:08:32 UTC (rev 7913) +++ armagetronad/trunk/armagetronad/src/engine/eGameObject.h 2008-02-14 00:40:50 UTC (rev 7914) @@ -230,7 +230,7 @@ virtual void DoRemoveFromGame(); //!< called when removed from the game }; -// game object of temporary lifetime on the stack +// game object of temporary lifetime on the stack. Don't dynamically allocate this. class eStackGameObject: public eGameObject { public: Modified: armagetronad/trunk/armagetronad/src/engine/eGrid.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/engine/eGrid.cpp 2008-02-14 00:08:32 UTC (rev 7913) +++ armagetronad/trunk/armagetronad/src/engine/eGrid.cpp 2008-02-14 00:40:50 UTC (rev 7914) @@ -2135,6 +2135,8 @@ A=B=C=NULL; a=b=c=NULL; + eGameObject::DeleteAll( this ); + // se_faceReplacements.clear(); } Modified: armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp 2008-02-14 00:08:32 UTC (rev 7913) +++ armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp 2008-02-14 00:40:50 UTC (rev 7914) @@ -1717,10 +1717,16 @@ tColoredString console; console << *sender; - if (sender->CurrentTeam() == team || !sender->CurrentTeam() ) { + if( !sender->CurrentTeam() ) + { + // foo --> Spectatos: message + console << tColoredString::ColorString(1,1,.5) << " --> " << tOutput("$player_spectator_message"); + } + else if (sender->CurrentTeam() == team) + { // foo --> Teammates: some message here console << tColoredString::ColorString(1,1,.5) << " --> "; - console << tColoredString::ColorString(team->R(),team->G(),team->B()) << "Teammates"; + console << tColoredString::ColorString(team->R(),team->G(),team->B()) << tOutput("$player_team_message"); } else { // foo (Red Team) --> Blue Team: some message here @@ -1783,7 +1789,6 @@ // prepares a chat message with a chat message originating from the given player to the given team static nMessage* se_ServerControlledChatMessage( eTeam const * team, ePlayerNetID const * sender, tString const & message ) { - tASSERT( team ); tASSERT( sender ); return se_ServerControlledChatMessageConsole( sender, se_BuildChatString(team, sender, message) ); @@ -1903,7 +1908,6 @@ // Sends a /team message void se_SendTeamMessage( eTeam const * team, ePlayerNetID const * sender ,ePlayerNetID const * receiver, tString const & message ) { - tASSERT( team ); tASSERT( receiver ); tASSERT( sender ); @@ -1918,10 +1922,15 @@ tColoredString say; say << tColoredString::ColorString(1,1,.5) << "( " << *sender; - // ( foo --> Teammates ) some message here - if (sender->CurrentTeam() == team) { + if( !sender->CurrentTeam() ) + { + // foo --> Spectatos: message + say << tColoredString::ColorString(1,1,.5) << " --> " << tOutput("$player_spectator_message"); + } + else if (sender->CurrentTeam() == team) { + // ( foo --> Teammates ) some message here say << tColoredString::ColorString(1,1,.5) << " --> "; - say << tColoredString::ColorString(team->R(),team->G(),team->B()) << "Teammates"; + say << tColoredString::ColorString(team->R(),team->G(),team->B()) << tOutput("$player_team_message");; } // ( foo (Blue Team) --> Red Team ) some message else { @@ -2435,7 +2444,7 @@ } else { - tConfItemBase::LoadAll(s); + tConfItemBase::LoadLine(s); } } @@ -2727,8 +2736,10 @@ // /team chat commant: talk to your team static void se_ChatTeam( ePlayerNetID * p, std::istream & s, eChatSpamTester & spam ) { - // odd, the refactored original did not check for silence. Probably by design. - if ( /* IsSilencedWithWarning(player) || */ spam.Block() ) + eTeam *currentTeam = se_GetManagedTeam( p ); + + // silencing only affects spectators here + if ( ( !currentTeam && IsSilencedWithWarning(p) ) || spam.Block() ) { return; } @@ -2736,16 +2747,15 @@ tString msg; msg.ReadLine( s ); - eTeam *currentTeam = se_GetManagedTeam( p ); - + // Log message to server and sender + tColoredString messageForServerAndSender = se_BuildChatString(currentTeam, p, msg); + messageForServerAndSender << "\n"; + if (currentTeam != NULL) // If a player has just joined the game, he is not yet on a team. Sending a /team message will crash the server { - // Log message to server and sender - tColoredString messageForServerAndSender = se_BuildChatString(currentTeam, p, msg); - messageForServerAndSender << "\n"; sn_ConsoleOut(messageForServerAndSender, 0); sn_ConsoleOut(messageForServerAndSender, p->Owner()); - + // Send message to team-mates int numTeamPlayers = currentTeam->NumPlayers(); for (int teamPlayerIndex = 0; teamPlayerIndex < numTeamPlayers; teamPlayerIndex++) { @@ -2775,7 +2785,19 @@ } else { - sn_ConsoleOut(tOutput("$player_not_on_team"), p->Owner()); + sn_ConsoleOut(messageForServerAndSender, 0); + sn_ConsoleOut(messageForServerAndSender, p->Owner()); + + // check for other spectators + for( int i = se_PlayerNetIDs.Len() - 1; i >=0; --i ) + { + ePlayerNetID * spectator = se_PlayerNetIDs(i); + + if ( se_GetManagedTeam( spectator ) == 0 && spectator != p ) + { + se_SendTeamMessage(currentTeam, p, spectator, msg); + } + } } } @@ -3726,6 +3748,7 @@ greeted =false; chatting_ =false; spectating_ =false; + stealth_ =false; disconnected=false; chatFlags_ =0; Modified: armagetronad/trunk/armagetronad/src/engine/eTeam.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/engine/eTeam.cpp 2008-02-14 00:08:32 UTC (rev 7913) +++ armagetronad/trunk/armagetronad/src/engine/eTeam.cpp 2008-02-14 00:40:50 UTC (rev 7914) @@ -1343,6 +1343,7 @@ locked_ = false; maxPlayersLocal = maxPlayers; maxImbalanceLocal = maxImbalance; + r = g = b = 32; // initialize color so it will be updated, guaranteed Update(); } Modified: armagetronad/trunk/armagetronad/src/engine/eWall.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/engine/eWall.cpp 2008-02-14 00:08:32 UTC (rev 7913) +++ armagetronad/trunk/armagetronad/src/engine/eWall.cpp 2008-02-14 00:40:50 UTC (rev 7914) @@ -105,17 +105,12 @@ const eCoord *p2 = &w->EndPoint(1); BeginQuads(); - IsEdge(false); TexVertex(p1->x, p1->y, bot, tBeg , hfrac); - - IsEdge(false); TexVertex(p1->x, p1->y, h*hfrac, tBeg , 0); - - IsEdge(false); TexVertex(p2->x, p2->y, h*hfrac, 0 , 0); Modified: armagetronad/trunk/armagetronad/src/network/nNetwork.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/network/nNetwork.cpp 2008-02-14 00:08:32 UTC (rev 7913) +++ armagetronad/trunk/armagetronad/src/network/nNetwork.cpp 2008-02-14 00:40:50 UTC (rev 7914) @@ -2899,7 +2899,7 @@ void sn_CenterMessage(const tOutput &o,int client){ tString message(o); - nMessage *m=new nMessage(client_cen_nd); + tJUST_CONTROLLED_PTR< nMessage > m=new nMessage(client_cen_nd); *m << message; if (client<0){ m->BroadCast(); Modified: armagetronad/trunk/armagetronad/src/render/rConsoleGraph.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/render/rConsoleGraph.cpp 2008-02-14 00:08:32 UTC (rev 7913) +++ armagetronad/trunk/armagetronad/src/render/rConsoleGraph.cpp 2008-02-14 00:40:50 UTC (rev 7914) @@ -36,12 +36,15 @@ #include "rScreen.h" #include "rGL.h" #include "tConfiguration.h" +#include "rDisplayList.h" static tColoredString sr_centerString; static REAL center_r,center_g,center_b,center_fadetime; static REAL Time; +static rDisplayListAlphaSensitive sr_consoleDisplayList; + static void sr_ConsolePerFrame(){ if (sr_con.autoDisplayAtSwap) sr_con.Render(); @@ -99,6 +102,34 @@ if (sr_screen){ Time=tSysTimeFloat(); + if (Time-center_fadetime<2){ + REAL alpha=center_fadetime-Time+1; + if (alpha>1) alpha=1; + if (alpha<0) alpha=0; + rTextField::SetDefaultColor( tColor(center_r,center_g,center_b,alpha) ); + + REAL width=rCWIDTH_CON*4; + REAL height=rCHEIGHT_CON*4; + REAL len=sr_centerString.LongestLine(); + REAL lines=(REAL)(sr_centerString.Count('\n')+1); + + REAL space = 1.6; + REAL needed = width * len; + if (needed > space) { + width *= space/needed; + height *= space/needed; + } + space = 0.9 + centerMessageY; + needed = height*lines; + if (needed > space) { + width *= space/needed; + height *= space/needed; + } + + DisplayText(0,centerMessageY,height,sr_centerString,sr_fontCenterMessage); + //std::cerr << "DisplayText(0," << centerMessageY << "," << (rCWIDTH_CON*4*fak) << "," << (rCHEIGHT_CON*4*fak) << "," <<sr_centerString << ");\n"; + } + if (sr_textOut || rForceTextCallback::ForceText()){ if (lastCustomTimeout<Time-5 && lastTimeout+timeout<Time && currentTop<currentIn){ @@ -106,8 +137,23 @@ lastTimeout=Time; } + static int lastTop = currentTop; + static int lastIn = currentIn; + if ( lastTop != currentTop || lastIn != currentIn ) + { + lastTop = currentTop; + lastIn = currentIn; + sr_consoleDisplayList.Clear(); + } + rTextField::SetDefaultColor( tColor(1,1,1) ); + if ( sr_consoleDisplayList.Call() ) + { + return; + } + rDisplayListFiller filler( sr_consoleDisplayList ); + rTextField out(-.95f,.99f,rCHEIGHT_CON, sr_fontConsole);//,&rFont::s_defaultFontSmall); out.SetWidth(1.9f); out.EnableLineWrap(); @@ -133,34 +179,6 @@ } } - if (Time-center_fadetime<2){ - REAL alpha=center_fadetime-Time+1; - if (alpha>1) alpha=1; - if (alpha<0) alpha=0; - rTextField::SetDefaultColor( tColor(center_r,center_g,center_b,alpha) ); - - REAL width=rCWIDTH_CON*4; - REAL height=rCHEIGHT_CON*4; - REAL len=sr_centerString.LongestLine(); - REAL lines=(REAL)(sr_centerString.Count('\n')+1); - - REAL space = 1.6; - REAL needed = width * len; - if (needed > space) { - width *= space/needed; - height *= space/needed; - } - space = 0.9 + centerMessageY; - ... [truncated message content] |
From: <baz...@us...> - 2008-02-14 17:06:20
|
Revision: 7926 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7926&view=rev Author: bazaarmagetron Date: 2008-02-14 09:06:25 -0800 (Thu, 14 Feb 2008) Log Message: ----------- Manuel Moos: Fixed debug compilation. Duh. Modified Paths: -------------- armagetronad/trunk/armagetronad/src/render/rGL.cpp Property Changed: ---------------- armagetronad/trunk/armagetronad/ Property changes on: armagetronad/trunk/armagetronad ___________________________________________________________________ Name: bzr:revision-info - timestamp: 2008-02-11 15:15:09.667999983 +0100 committer: Manuel Moos <z-...@us...> properties: branch-nick: armagetronad + timestamp: 2008-02-14 18:01:10.957999945 +0100 committer: Manuel Moos <z-...@us...> properties: branch-nick: armagetronad Name: bzr:revision-id:v3-list-QlpoOTFBWSZTWZvbKhsAAAdRgAAQABK6798QIABURMgAAaeoNT1TxT1DQbKaeobXKiyAmlWT7Y5MkdJOtXDtB7w7DOGFBHiOBxaUIu7HQyyQSvxdyRThQkJvbKhs - 613 z-...@us...-20080211141509-cwbrb6hmtz9313jr + 613 z-...@us...-20080211141509-cwbrb6hmtz9313jr 626 z-...@us...-20080214170110-rhfpd874zuogr3cm Modified: armagetronad/trunk/armagetronad/src/render/rGL.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/render/rGL.cpp 2008-02-14 16:10:36 UTC (rev 7925) +++ armagetronad/trunk/armagetronad/src/render/rGL.cpp 2008-02-14 17:06:25 UTC (rev 7926) @@ -29,6 +29,7 @@ #include "tError.h" #include <sstream> #include <iomanip> +#include "rGL.h" #ifdef AA_GL_ERROR_CHECKING void sr_CheckGLError() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <baz...@us...> - 2008-02-14 17:12:17
|
Revision: 7927 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7927&view=rev Author: bazaarmagetron Date: 2008-02-14 09:12:18 -0800 (Thu, 14 Feb 2008) Log Message: ----------- Manuel Moos: ignoring aa_config.h(.in), too. Modified Paths: -------------- armagetronad/trunk/armagetronad/.bzrignore Property Changed: ---------------- armagetronad/trunk/armagetronad/ Property changes on: armagetronad/trunk/armagetronad ___________________________________________________________________ Name: bzr:revision-info - timestamp: 2008-02-14 18:01:10.957999945 +0100 committer: Manuel Moos <z-...@us...> properties: branch-nick: armagetronad + timestamp: 2008-02-14 18:02:44.710999966 +0100 committer: Manuel Moos <z-...@us...> properties: branch-nick: armagetronad Name: bzr:revision-id:v3-list-QlpoOTFBWSZTWZvbKhsAAAdRgAAQABK6798QIABURMgAAaeoNT1TxT1DQbKaeobXKiyAmlWT7Y5MkdJOtXDtB7w7DOGFBHiOBxaUIu7HQyyQSvxdyRThQkJvbKhs - 613 z-...@us...-20080211141509-cwbrb6hmtz9313jr 626 z-...@us...-20080214170110-rhfpd874zuogr3cm + 613 z-...@us...-20080211141509-cwbrb6hmtz9313jr 626 z-...@us...-20080214170110-rhfpd874zuogr3cm 627 z-...@us...-20080214170244-1gstsfe9yzyvrx9b Modified: armagetronad/trunk/armagetronad/.bzrignore =================================================================== --- armagetronad/trunk/armagetronad/.bzrignore 2008-02-14 17:06:25 UTC (rev 7926) +++ armagetronad/trunk/armagetronad/.bzrignore 2008-02-14 17:12:18 UTC (rev 7927) @@ -41,3 +41,5 @@ *.html html.m4 *.dep +aa_config.h.in +./aa_config.h This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <z-...@us...> - 2008-02-15 21:40:53
|
Revision: 7949 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7949&view=rev Author: z-man Date: 2008-02-15 13:40:57 -0800 (Fri, 15 Feb 2008) Log Message: ----------- Merging branch 0.2.8 from revision 7916 to 7947: ------------------------------------------------------------------------ r7947 | bazaarmagetron | 2008-02-15 21:45:24 +0100 (Fri, 15 Feb 2008) | 2 lines Manuel Moos: Erm, you can now see your own trail again in incam mode :) ------------------------------------------------------------------------ r7946 | bazaarmagetron | 2008-02-15 21:40:22 +0100 (Fri, 15 Feb 2008) | 2 lines Manuel Moos: Addon to last commit. ------------------------------------------------------------------------ r7945 | bazaarmagetron | 2008-02-15 21:39:43 +0100 (Fri, 15 Feb 2008) | 2 lines Manuel Moos: Added checks so that KICK, SILENCE, VOICE only work on the server and KILL and (DIS)ALLOW_TEAM_CHANGE don't work on the client. ------------------------------------------------------------------------ r7944 | z-man | 2008-02-15 20:28:21 +0100 (Fri, 15 Feb 2008) | 1 line Added rGL.cpp and rDisplayList.h/cpp. ------------------------------------------------------------------------ r7942 | bazaarmagetron | 2008-02-15 15:50:52 +0100 (Fri, 15 Feb 2008) | 2 lines Manuel Moos: Hey, what sense does an if (bla); return; have AT THE END of a function? ------------------------------------------------------------------------ r7941 | bazaarmagetron | 2008-02-15 15:50:21 +0100 (Fri, 15 Feb 2008) | 2 lines Manuel Moos: Avoiding all but one of the ResetRenderState() calls. ------------------------------------------------------------------------ r7940 | bazaarmagetron | 2008-02-15 15:32:56 +0100 (Fri, 15 Feb 2008) | 2 lines Manuel Moos: Caching old style HUD in display lists. (not merged, does not apply) ------------------------------------------------------------------------ r7939 | bazaarmagetron | 2008-02-15 15:32:29 +0100 (Fri, 15 Feb 2008) | 2 lines Manuel Moos: Added warning about problematic GL calls in display lists. ------------------------------------------------------------------------ r7938 | bazaarmagetron | 2008-02-15 14:04:50 +0100 (Fri, 15 Feb 2008) | 2 lines Manuel Moos: Smarter (more resource friendly) generation of cycle tail display lists. ------------------------------------------------------------------------ r7937 | bazaarmagetron | 2008-02-15 12:51:48 +0100 (Fri, 15 Feb 2008) | 2 lines Manuel Moos: Avoiding redundant color settings. ------------------------------------------------------------------------ r7935 | z-man | 2008-02-15 10:01:56 +0100 (Fri, 15 Feb 2008) | 3 lines Moved files to the right place, disabled ZThread linking for the client. ------------------------------------------------------------------------ r7934 | z-man | 2008-02-15 10:00:55 +0100 (Fri, 15 Feb 2008) | 2 lines Disabled special case for the Mac; the display list crash seemed to have come from redundant color changes. ------------------------------------------------------------------------ r7933 | bazaarmagetron | 2008-02-15 09:39:48 +0100 (Fri, 15 Feb 2008) | 2 lines Manuel Moos: Uniform vertex data for cycle wall display list. ------------------------------------------------------------------------ r7932 | z-man | 2008-02-15 01:51:58 +0100 (Fri, 15 Feb 2008) | 6 lines Workaround for mysterious OSX display list crashes. --This line, and those below, will be ignored- M gWall.cpp ------------------------------------------------------------------------ r7931 | z-man | 2008-02-14 23:57:21 +0100 (Thu, 14 Feb 2008) | 2 lines Added rGL.cpp and rDisplayLists.h/cpp. ------------------------------------------------------------------------ r7925 | bazaarmagetron | 2008-02-14 17:10:36 +0100 (Thu, 14 Feb 2008) | 2 lines Manuel Moos: Clearing display list when temporary walls are removed. ------------------------------------------------------------------------ r7924 | bazaarmagetron | 2008-02-14 16:33:18 +0100 (Thu, 14 Feb 2008) | 2 lines Manuel Moos: Fixed rendering crash when player disappeared. ------------------------------------------------------------------------ r7923 | bazaarmagetron | 2008-02-14 16:05:03 +0100 (Thu, 14 Feb 2008) | 2 lines Manuel Moos: Attempt to fix Mac exit crash. ------------------------------------------------------------------------ r7922 | bazaarmagetron | 2008-02-14 15:46:49 +0100 (Thu, 14 Feb 2008) | 2 lines Manuel Moos: Fixed rendering errors with zones: they and other alpha blended game objects are always (well, single frame exceptions are allowed) rendered last. ------------------------------------------------------------------------ r7921 | bazaarmagetron | 2008-02-14 15:46:09 +0100 (Thu, 14 Feb 2008) | 2 lines Manuel Moos: Added support for authority "blurb" messages. Authorities can append lines to the "PASSWORD_OK" response, and those lines will be transformed and logged in ladderlog.txt. ------------------------------------------------------------------------ r7920 | bazaarmagetron | 2008-02-14 15:45:46 +0100 (Thu, 14 Feb 2008) | 1 line Manuel Moos: Empty merge to keep the peace between svn and bzr. ------------------------------------------------------------------------ r7919 | bazaarmagetron | 2008-02-14 14:03:13 +0100 (Thu, 14 Feb 2008) | 2 lines Manuel Moos: Added support for authority "blurb" messages. Authorities can append lines to the "PASSWORD_OK" response, and those lines will be transformed and logged in ladderlog.txt. ------------------------------------------------------------------------ r7918 | z-man | 2008-02-14 13:55:38 +0100 (Thu, 14 Feb 2008) | 2 lines Added example blurb message. ------------------------------------------------------------------------ Revision Links: -------------- http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7916&view=rev Modified Paths: -------------- armagetronad/trunk/armagetronad/batch/authentication_reference.php armagetronad/trunk/armagetronad/language/english_base.txt armagetronad/trunk/armagetronad/src/engine/eGameObject.cpp armagetronad/trunk/armagetronad/src/engine/eGameObject.h armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp armagetronad/trunk/armagetronad/src/network/nAuthentication.cpp armagetronad/trunk/armagetronad/src/network/nKrawall.h armagetronad/trunk/armagetronad/src/network/nKrawallPrivate.cpp armagetronad/trunk/armagetronad/src/render/rDisplayList.cpp armagetronad/trunk/armagetronad/src/render/rDisplayList.h armagetronad/trunk/armagetronad/src/render/rGLRender.cpp armagetronad/trunk/armagetronad/src/render/rTexture.cpp armagetronad/trunk/armagetronad/src/tron/gCycle.cpp armagetronad/trunk/armagetronad/src/tron/gCycle.h armagetronad/trunk/armagetronad/src/tron/gWall.cpp armagetronad/trunk/armagetronad/src/tron/gWall.h armagetronad/trunk/armagetronad/src/tron/gWinZone.cpp armagetronad/trunk/armagetronad/src/tron/gWinZone.h Modified: armagetronad/trunk/armagetronad/batch/authentication_reference.php =================================================================== --- armagetronad/trunk/armagetronad/batch/authentication_reference.php 2008-02-15 21:27:14 UTC (rev 7948) +++ armagetronad/trunk/armagetronad/batch/authentication_reference.php 2008-02-15 21:40:57 UTC (rev 7949) @@ -261,7 +261,20 @@ if (strcasecmp($hash, $correctHash) === 0) { // he did! Return OK, followed by the user's full name. - conclude(200, 'PASSWORD_OK ' . $trueUser . '@' . $authority ); + // You can also append "blurb" messages in subsequent lines. + // Those messages will be transformed a little (the first word gets + // AUTHORITY_BLURB_ prepended to it and the user's authenticated name + // is added as a second token) and written to the server's ladder log. + conclude(200, 'PASSWORD_OK ' . $trueUser . '@' . $authority . "\nFOO baz" ); + + // A useful blurb example would be a line containing: + // ALIAS oldusername@oldauthority + // It would get logged as + // AUTHORITY_BLURB_ALIAS user@authority oldusername@oldauthority + // and nice ladder log parsing scripts can choose to believe your + // authority and assume user@authority and oldusername@oldauthority + // are the same person. It is a matter between ladderlog parser writers + // and authority implementers to define more useful standard blurb messages. } // he didn't. Modified: armagetronad/trunk/armagetronad/language/english_base.txt =================================================================== --- armagetronad/trunk/armagetronad/language/english_base.txt 2008-02-15 21:27:14 UTC (rev 7948) +++ armagetronad/trunk/armagetronad/language/english_base.txt 2008-02-15 21:40:57 UTC (rev 7949) @@ -797,6 +797,7 @@ exit_help Shuts the dedicated server down and quits. # manning and kicking commands +only_works_on_server The console command \1 only works on the server. You probably want to say "/admin \1 \2".\n players_help Prints list of currently active players kill_help Kill a specific player (as warning before a kick) silence_help Silence a specific player so he can't use public chat any more (/msg and /team still work) Modified: armagetronad/trunk/armagetronad/src/engine/eGameObject.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/engine/eGameObject.cpp 2008-02-15 21:27:14 UTC (rev 7948) +++ armagetronad/trunk/armagetronad/src/engine/eGameObject.cpp 2008-02-15 21:40:57 UTC (rev 7949) @@ -618,6 +618,17 @@ void eGameObject::Render(const eCamera *){} void eGameObject::Render2D(tCoord scale) const {} +// ******************************************************************************* +// * +// * RendersAlpha +// * +// ******************************************************************************* +//! +//! @return True if alpha blending is used +//! +// ******************************************************************************* +bool eGameObject::RendersAlpha() const{return false;} + // Cockpit bool eGameObject::RenderCockpitFixedBefore(bool){return true;} // return value: draw everything else? @@ -827,16 +838,52 @@ void eGameObject::RenderAll(eGrid *grid, const eCamera *cam){ //if (!sr_glOut) // return; - + + // first, we need to render all the non-alpha blended objects. + // if we encounter non-alpha blended objects after alpha blended objects + // have already been rendered, we need to re-sort them to the back. + eGameObject * firstAlpha = NULL; for(int i=grid->gameObjects.Len()-1;i>=0;i--){ su_FetchAndStoreSDLInput(); if (sr_glOut){ + eGameObject * object = grid->gameObjects(i); #ifdef DEBUG - displayed_gameobject = grid->gameObjects(i); + displayed_gameobject = object; #endif + + sr_CheckGLError(); + + object->Render(cam); + + bool thisAlpha = object->RendersAlpha(); + if ( !thisAlpha && firstAlpha ) + { + // resort the object, switch places with the first alpha blended one. + // This will only have an effect in the next frame, + // but the small flickering error is to be tolerated, especially + // since alpha blended game objects tend to gently fade in. + int firstAlphaID = firstAlpha->id; + grid->gameObjects.Remove(firstAlpha,firstAlpha->id); + grid->gameObjects.Add(firstAlpha,firstAlpha->id); + grid->gameObjects.Remove(object,object->id); + grid->gameObjects.Add(object,object->id); + + // the first alpha blended object no longer is the first. Look for + // a replacement, only one object is a candidate. + firstAlpha = 0; + if ( firstAlphaID > 0 ) + { + firstAlpha = grid->gameObjects(firstAlphaID - 1); + tASSERT( firstAlpha->RendersAlpha() ); + } + } + if ( thisAlpha && !firstAlpha ) + { + // store first known alpha blending object + firstAlpha = object; + } sr_CheckGLError(); - grid->gameObjects(i)->Render(cam); - sr_CheckGLError(); + #ifdef DEBUG displayed_gameobject = 0; #endif Modified: armagetronad/trunk/armagetronad/src/engine/eGameObject.h =================================================================== --- armagetronad/trunk/armagetronad/src/engine/eGameObject.h 2008-02-15 21:27:14 UTC (rev 7948) +++ armagetronad/trunk/armagetronad/src/engine/eGameObject.h 2008-02-15 21:40:57 UTC (rev 7949) @@ -172,6 +172,9 @@ // draws it to the screen in two dimensions using OpenGL (ie. for the HUD map) virtual void Render2D(tCoord scale) const; + //! returns whether the rendering uses alpha blending (massively, so sorting errors would show) + virtual bool RendersAlpha() const; + // draws the cockpit or whatever is seen from the interior // in fixed perspective, called before the main rendering virtual bool RenderCockpitFixedBefore(bool primary=true); Modified: armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp 2008-02-15 21:27:14 UTC (rev 7948) +++ armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp 2008-02-15 21:40:57 UTC (rev 7949) @@ -800,6 +800,22 @@ if (success) { player->Authenticate( authName, result.accessLevel ); + + // log blurb to ladderlog. This is not important for debug playback, + // so we just don't record it. Once more is done with the blurb, + // we need to change that. + for ( std::deque< tString >::const_iterator i = result.blurb.begin(); i != result.blurb.end(); ++i ) + { + std::istringstream s( static_cast< char const * >( *i ) ); + tString token, rest; + s >> token; + rest.ReadLine( s ); + + std::ostringstream o; + o << "AUTHORITY_BLURB_" << token << " " << player->GetFilteredAuthenticatedName() << " " << rest << std::endl; + + se_SaveToLadderLog( o.str().c_str() ); + } } else { @@ -6414,8 +6430,28 @@ return 0; } + +// call on commands that only work on the server; quit if it returns true +static bool se_NeedsServer(char const * command, std::istream & s, bool strict = true ) +{ + if ( sn_GetNetState() != nSERVER && ( strict || sn_GetNetState() != nSTANDALONE ) ) + { + tString rest; + rest.ReadLine( s ); + con << tOutput("$only_works_on_server", command, rest ); + return true; + } + + return false; +} + static void se_PlayerMessageConf(std::istream &s) { + if ( se_NeedsServer( "PLAYER_MESSAGE", s ) ) + { + return; + } + int receiver = se_ReadUser( s ); tColoredString msg; @@ -6441,6 +6477,11 @@ static void se_KickConf(std::istream &s) { + if ( se_NeedsServer( "KICK", s ) ) + { + return; + } + // get user ID int num = se_ReadUser( s ); @@ -6473,6 +6514,11 @@ static void se_MoveToConf(std::istream &s, REAL severity ) { + if ( se_NeedsServer( "KICK/MOVE_TO", s ) ) + { + return; + } + // get user ID int num = se_ReadUser( s ); @@ -6523,6 +6569,11 @@ static void se_BanConf(std::istream &s) { + if ( se_NeedsServer( "BAN", s ) ) + { + return; + } + // get user ID int num = se_ReadUser( s ); @@ -6578,6 +6629,11 @@ static void Kill_conf(std::istream &s) { + if ( se_NeedsServer( "KILL", s, false ) ) + { + return; + } + ePlayerNetID * p = ReadPlayer( s ); if ( p && p->Object() ) p->Object()->Kill(); @@ -6588,6 +6644,11 @@ static void Silence_conf(std::istream &s) { + if ( se_NeedsServer( "SILENCE", s ) ) + { + return; + } + ePlayerNetID * p = ReadPlayer( s ); if ( p ) { @@ -6601,6 +6662,11 @@ static void Voice_conf(std::istream &s) { + if ( se_NeedsServer( "VOICE", s ) ) + { + return; + } + ePlayerNetID * p = ReadPlayer( s ); if ( p ) { @@ -7244,6 +7310,11 @@ } static void se_allowTeamChangesPlayer(bool allow, std::istream &s) { + if ( se_NeedsServer( "(DIS)ALLOW_TEAM_CHANGE_PLAYER", s, false ) ) + { + return; + } + ePlayerNetID * p = ReadPlayer( s ); if ( p ) { Modified: armagetronad/trunk/armagetronad/src/network/nAuthentication.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/network/nAuthentication.cpp 2008-02-15 21:27:14 UTC (rev 7948) +++ armagetronad/trunk/armagetronad/src/network/nAuthentication.cpp 2008-02-15 21:40:57 UTC (rev 7949) @@ -274,7 +274,7 @@ static void ScheduleForeground( T & object, void (T::*function)() ) { #ifdef HAVE_LIBZTHREAD - pending_.add( nMemberFunctionRunnerTemplate( object, function ) ); + Pending().add( nMemberFunctionRunnerTemplate( object, function ) ); st_ToDo( FinishAll ); #else // execute it immedeately @@ -306,15 +306,19 @@ #ifdef HAVE_LIBZTHREAD // queue of foreground tasks - static ZThread::LockedQueue< nMemberFunctionRunnerTemplate, ZThread::FastMutex > pending_; + static ZThread::LockedQueue< nMemberFunctionRunnerTemplate, ZThread::FastMutex > & Pending() + { + static ZThread::LockedQueue< nMemberFunctionRunnerTemplate, ZThread::FastMutex > pending; + return pending; + } // function that calls them static void FinishAll() { // finish all pending tasks - while( pending_.size() > 0 ) + while( Pending().size() > 0 ) { - nMemberFunctionRunnerTemplate next = pending_.next(); + nMemberFunctionRunnerTemplate next = Pending().next(); next.run(); } } @@ -325,13 +329,6 @@ std::deque< nMemberFunctionRunnerTemplate<T> > nMemberFunctionRunnerTemplate<T>::pendingForBreak_; -#ifdef HAVE_LIBZTHREAD -// static queue -template< class T > -ZThread::LockedQueue< nMemberFunctionRunnerTemplate<T>, ZThread::FastMutex > -nMemberFunctionRunnerTemplate<T>::pending_; -#endif - // convenience wrapper class nMemberFunctionRunner { Modified: armagetronad/trunk/armagetronad/src/network/nKrawall.h =================================================================== --- armagetronad/trunk/armagetronad/src/network/nKrawall.h 2008-02-15 21:27:14 UTC (rev 7948) +++ armagetronad/trunk/armagetronad/src/network/nKrawall.h 2008-02-15 21:40:57 UTC (rev 7949) @@ -45,6 +45,8 @@ // #include "nNetObject.h" #include "tConfiguration.h" +#include <deque> + class nNetObject; #ifndef _IOSFWD_ @@ -176,6 +178,7 @@ tString authority; // authority (shorthand version allowed); authenticated name is username@authority bool success; // was the operation successful? tString error; // potential error message + std::deque< tString > blurb; // additional blurb data the authority may give on successful login tAccessLevel accessLevel;// access level of user Modified: armagetronad/trunk/armagetronad/src/network/nKrawallPrivate.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/network/nKrawallPrivate.cpp 2008-02-15 21:27:14 UTC (rev 7948) +++ armagetronad/trunk/armagetronad/src/network/nKrawallPrivate.cpp 2008-02-15 21:40:57 UTC (rev 7949) @@ -422,6 +422,18 @@ } } + // read additional data, let caller handle it + while( true ) + { + tString blurb; + blurb.ReadLine( content ); + if ( content.eof() || content.fail() ) + { + break; + } + result.blurb.push_back( blurb ); + } + result.success = true; return; } Modified: armagetronad/trunk/armagetronad/src/render/rDisplayList.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/render/rDisplayList.cpp 2008-02-15 21:27:14 UTC (rev 7948) +++ armagetronad/trunk/armagetronad/src/render/rDisplayList.cpp 2008-02-15 21:40:57 UTC (rev 7949) @@ -195,6 +195,12 @@ : list_( list ) #endif { + Start(); +} + +// starts filling the display list +void rDisplayListFiller::Start() +{ #ifndef DEDICATED bool useList = sr_useDisplayLists != rDisplayList_Off && list_.inhibit_ == 0 && !sr_isRecording; if ( useList ) @@ -217,7 +223,7 @@ } #ifdef LIST_STATS - if ( !useList ) + if ( !useList && !sr_isRecording ) { sr_counter.Count( rListCounter::Not ); } Modified: armagetronad/trunk/armagetronad/src/render/rDisplayList.h =================================================================== --- armagetronad/trunk/armagetronad/src/render/rDisplayList.h 2008-02-15 21:27:14 UTC (rev 7948) +++ armagetronad/trunk/armagetronad/src/render/rDisplayList.h 2008-02-15 21:40:57 UTC (rev 7949) @@ -50,6 +50,11 @@ // + rendering code } } + +// Things we have found to be problematic in certain OpenGL +// implementations: +// - Redundant color settings (glColor3f(1,1,1);glColor3f(1,1,1);) +// - Infinite points (glVertex4f(1,1,0,0);) #endif //! display list wrapper @@ -69,6 +74,15 @@ #endif } + bool IsInhibited() const + { +#ifndef DEDICATED + return inhibit_; +#else + return false; +#endif + } + //! check whether a displaylist is currently being recorded. static bool IsRecording(); @@ -118,6 +132,9 @@ //! constructor, automatically starting to fill teh list explicit rDisplayListFiller( rDisplayList & list ); ~rDisplayListFiller(); + + //! starts filling the display list (done automatically on construction) + void Start(); //! stops filling the display list (done automatically on destruction) void Stop(); Modified: armagetronad/trunk/armagetronad/src/render/rGLRender.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/render/rGLRender.cpp 2008-02-15 21:27:14 UTC (rev 7948) +++ armagetronad/trunk/armagetronad/src/render/rGLRender.cpp 2008-02-15 21:40:57 UTC (rev 7949) @@ -53,6 +53,7 @@ if ( lastPrimitive != p ) { + sr_CheckGLError(); glBegin(p); } Modified: armagetronad/trunk/armagetronad/src/render/rTexture.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/render/rTexture.cpp 2008-02-15 21:27:14 UTC (rev 7948) +++ armagetronad/trunk/armagetronad/src/render/rTexture.cpp 2008-02-15 21:40:57 UTC (rev 7949) @@ -536,6 +536,8 @@ #ifndef DEDICATED if(sr_glOut) { + sr_CheckGLError(); + int texmod=rTextureGroups::TextureMode[group_]; if (enforce && texmod<0) texmod=GL_NEAREST_MIPMAP_NEAREST; Modified: armagetronad/trunk/armagetronad/src/tron/gCycle.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gCycle.cpp 2008-02-15 21:27:14 UTC (rev 7948) +++ armagetronad/trunk/armagetronad/src/tron/gCycle.cpp 2008-02-15 21:40:57 UTC (rev 7949) @@ -2057,6 +2057,34 @@ }; #endif +#ifndef DEDICATED +// renders a cycle even after it died +class gCycleWallRenderer: public eReferencableGameObject +{ +public: + gCycleWallRenderer( gCycle * cycle ) + : eReferencableGameObject( cycle->Grid(), cycle->Position(), cycle->Direction(), cycle->CurrentFace(), true ) + , cycle_( cycle ) + { + AddToList(); + } +private: + virtual void Render( eCamera const * camera ) + { + cycle_->displayList_.RenderAll( camera, cycle_ ); + } + + virtual bool Timestep( REAL currentTime ) + { + Move( cycle_->Position(), lastTime, currentTime ); + + return !cycle_->displayList_.Walls(); + } + + tJUST_CONTROLLED_PTR< gCycle > cycle_; +}; +#endif + void gCycle::MyInitAfterCreation(){ #ifndef DEDICATED joystick_ = tNEW( gJoystick( this ) ); @@ -2064,6 +2092,11 @@ joystick_ = NULL; #endif +// create wall renderer +#ifndef DEDICATED + new gCycleWallRenderer( this ); +#endif + dropWallRequested_ = false; lastGoodPosition_ = pos; @@ -2301,42 +2334,8 @@ */ } -#ifndef DEDICATED -// renders a cycle even after it died -class gCycleRenderer: public eReferencableGameObject -{ -public: - gCycleRenderer( gCycle * cycle ) - : eReferencableGameObject( cycle->Grid(), cycle->Position(), cycle->Direction(), cycle->CurrentFace(), true ) - , cycle_( cycle ) - { - AddToList(); - } -private: - virtual void Render( eCamera const * camera ) - { - cycle_->Render( camera ); - } - - virtual bool Timestep( REAL currentTime ) - { - return !cycle_->displayList_.Walls(); - } - - tJUST_CONTROLLED_PTR< gCycle > cycle_; -}; -#endif - void gCycle::OnRemoveFromGame() { -#ifndef DEDICATED - // keep rendering the cycle - if ( GOID() >= 0 ) - { - tNEW( gCycleRenderer( this ) ); - } -#endif - // keep this cycle alive during this function tJUST_CONTROLLED_PTR< gCycle > keep; @@ -2528,14 +2527,6 @@ // die completely Die( lastTime ); -#ifndef DEDICATED - // keep rendering the cycle - if ( GOID() >= 0 ) - { - tNEW( gCycleRenderer( this ) ); - } -#endif - // and let yourself be removed from the lists so we don't have to go // through this again. return true; @@ -2659,13 +2650,6 @@ currentWall->Update(predictTime, PredictPosition() ); } -#ifndef DEDICATED - // keep rendering the cycle - if ( ret && GOID() >= 0 ) - { - tNEW( gCycleRenderer( this ) ); - } -#endif return ret; } @@ -3794,7 +3778,14 @@ cp[2]=b; } Colour(ePlayerNetID* player) { - player->Color(cp[0], cp[1], cp[2]); + if ( player ) + { + player->Color(cp[0], cp[1], cp[2]); + } + else + { + cp[0]=cp[1]=cp[2]=1; + } } void blend(REAL factor, const Colour& target) { for (int i=0; i<3; i++) { @@ -3939,6 +3930,7 @@ : wallList_(0) , wallsWithDisplayList_(0) , wallsWithDisplayListMinDistance_(0) + , wallsInDisplayList_(0) { } @@ -3961,20 +3953,20 @@ gNetPlayerWall * run = 0; // transfer walls with display list into their list + int wallsWithPossibleDisplayList = 0; run = wallList_; while( run ) { gNetPlayerWall * next = run->Next(); - if ( run->HasDisplayList() ) + if ( run->CanHaveDisplayList() ) { - run->Insert( wallsWithDisplayList_ ); - displayList_.Clear(0); + wallsWithPossibleDisplayList++; } else { // wall has expired, remove it if ( cycle->ThisWallsLength() > 0 && cycle->GetDistance() - cycle->MaxWallsLength() > run->EndPos() ) - + { run->Remove(); } @@ -3987,11 +3979,35 @@ } // clear display list if needed + bool tailExpired=false; if ( CannotHaveList( wallsWithDisplayListMinDistance_, cycle ) ) { + tailExpired=true; displayList_.Clear(0); } + // check if enough new walls are present to warrant altering the display list + else if ( wallsWithPossibleDisplayList >= 3 || + wallsWithPossibleDisplayList * 5 > wallsInDisplayList_ ) + { + // yes? Ok, rebuild the list in this case, too + displayList_.Clear(0); + } + else if ( wallsWithPossibleDisplayList ) + { + // oops, at least render the newcomers normally + run = wallList_; + while( run ) + { + gNetPlayerWall * next = run->Next(); + if ( run->CanHaveDisplayList() ) + { + run->Render( camera ); + } + run = next; + } + } + // call display list if ( displayList_.Call() ) { @@ -4003,7 +4019,7 @@ while( run ) { gNetPlayerWall * next = run->Next(); - if ( !run->HasDisplayList() ) + if ( !run->CanHaveDisplayList() || ( tailExpired && wallsWithDisplayListMinDistance_ >= run->BegPos() ) ) { run->Render( camera ); run->Insert( wallList_ ); @@ -4011,6 +4027,24 @@ run = next; } + if ( wallsWithPossibleDisplayList > 0 ) + { + run = wallList_; + while( run ) + { + gNetPlayerWall * next = run->Next(); + if ( run->CanHaveDisplayList() ) + { + run->Insert( wallsWithDisplayList_ ); + + // clear the wall's own display list, it will no longer be needed + run->ClearDisplayList(0, -1); + } + + run = next; + } + } + if ( !wallsWithDisplayList_ ) { return; @@ -4034,6 +4068,7 @@ } wallsWithDisplayListMinDistance_ = 1E+30; + wallsInDisplayList_ = 0; // render walls; // first, render all lines @@ -4050,6 +4085,8 @@ wallsWithDisplayListMinDistance_ = run->BegPos(); } + wallsInDisplayList_++; + run->RenderList( true, gNetPlayerWall::gWallRenderMode_Lines ); run = next; } @@ -4071,8 +4108,6 @@ } void gCycle::Render(const eCamera *cam){ - displayList_.RenderAll( cam, this ); - // are we blinking from invulnerability? bool blinking = false; if ( lastTime > spawnTime_ && !Vulnerable() ) Modified: armagetronad/trunk/armagetronad/src/tron/gCycle.h =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gCycle.h 2008-02-15 21:27:14 UTC (rev 7948) +++ armagetronad/trunk/armagetronad/src/tron/gCycle.h 2008-02-15 21:40:57 UTC (rev 7949) @@ -141,6 +141,7 @@ gNetPlayerWall * wallsWithDisplayList_; //!< linked list of all walls with display list rDisplayList displayList_; //!< combined display list REAL wallsWithDisplayListMinDistance_; //!< minimal distance of the walls with display list + int wallsInDisplayList_; //!< number of walls in the current display list }; #endif @@ -150,7 +151,7 @@ friend class gPlayerWall; friend class gNetPlayerWall; friend class gDestination; - friend class gCycleRenderer; + friend class gCycleWallRenderer; REAL spawnTime_; //!< time the cycle spawned at REAL lastTimeAnim; //!< last time animation was simulated at Modified: armagetronad/trunk/armagetronad/src/tron/gWall.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gWall.cpp 2008-02-15 21:27:14 UTC (rev 7948) +++ armagetronad/trunk/armagetronad/src/tron/gWall.cpp 2008-02-15 21:40:57 UTC (rev 7949) @@ -872,7 +872,7 @@ if ( gCycleWallsDisplayListManager::CannotHaveList( dbegin, cycle_ ) || this == cycle_->currentWall ) { - displayList_.Clear(); + ClearDisplayList(2); } if ( !displayList_.Call() ) @@ -974,7 +974,6 @@ else{ // complicated // can't squeeze that into a display list ClearDisplayList(); - tASSERT( renderMode == gWallRenderMode_All ); if (ta+gBEG_LEN>=time){ sr_CheckGLError(); @@ -1001,7 +1000,7 @@ } -bool upperlinecolor(REAL r,REAL g,REAL b, REAL a){ +inline bool upperlinecolor(REAL r,REAL g,REAL b, REAL a){ if (rTextureGroups::TextureMode[rTextureGroups::TEX_WALL]<0) glColor4f(1,1,1,a); else{ @@ -1052,7 +1051,7 @@ if (hfrac>0){ - if (upperlinecolor(r,g,b,a) && ( mode & gWallRenderMode_Lines ) ){ + if ( ( mode & gWallRenderMode_Lines ) ){ // draw additional upper line if ( mode == gWallRenderMode_All ) @@ -1066,8 +1065,9 @@ } BeginLines(); - + upperlinecolor(r,g,b,a); glVertex3f(p1.x,p1.y,h*hfrac); + upperlinecolor(r,g,b,a); glVertex3f(p2.x,p2.y,h*hfrac); // in the other modes, the caller is responsible for @@ -1111,13 +1111,13 @@ glColor3f(r,g,b); glTexCoord2f(te,hfrac); glVertex3f(p2.x,p2.y,extrarise); - } - // in the other modes, the caller is responsible for - // calling RenderEnd(). - if ( mode == gWallRenderMode_All ) - { - RenderEnd(); + // in the other modes, the caller is responsible for + // calling RenderEnd(). + if ( mode == gWallRenderMode_All ) + { + RenderEnd(); + } } } } @@ -1314,7 +1314,7 @@ void gNetPlayerWall::ClearDisplayList( int inhibitThis, int inhibitCycle ) { #ifndef DEDICATED - if ( HasDisplayList() && cycle_ ) + if ( CanHaveDisplayList() && cycle_ && inhibitCycle >= 0 ) { cycle_->displayList_.Clear( inhibitCycle ); } @@ -1560,6 +1560,8 @@ Wall()->SetVisHeight(i,0); Wall()->Remove(); + + displayList_.Clear(2); } @@ -1755,6 +1757,7 @@ sg_netPlayerWallsGridded.Add(this,griddedid); Wall()->Insert(); this->ReleaseData(); + ClearDisplayList(); } else{ sg_netPlayerWallsGridded.Add(this,griddedid); @@ -2470,7 +2473,7 @@ CHECKWALL; #ifndef DEDICATED - ClearDisplayList(); + ClearDisplayList(60); #endif #ifdef DEBUG Modified: armagetronad/trunk/armagetronad/src/tron/gWall.h =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gWall.h 2008-02-15 21:27:14 UTC (rev 7948) +++ armagetronad/trunk/armagetronad/src/tron/gWall.h 2008-02-15 21:40:57 UTC (rev 7949) @@ -277,8 +277,13 @@ return displayList_.IsSet(); } + bool CanHaveDisplayList() + { + return !displayList_.IsInhibited(); + } + //! clears the display list - void ClearDisplayList( int inhibitThis = 1, int inhibitCycle = 0 ); + void ClearDisplayList( int inhibitThis = 2, int inhibitCycle = 0 ); private: tArray<gPlayerWallCoord> coords_; Modified: armagetronad/trunk/armagetronad/src/tron/gWinZone.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gWinZone.cpp 2008-02-15 21:27:14 UTC (rev 7948) +++ armagetronad/trunk/armagetronad/src/tron/gWinZone.cpp 2008-02-15 21:40:57 UTC (rev 7949) @@ -559,8 +559,23 @@ #endif } + // ******************************************************************************* // * +// * RendersAlpha +// * +// ******************************************************************************* +//! +//! @return True if alpha blending is used +//! +// ******************************************************************************* +bool gZone::RendersAlpha() const +{ + return sr_alphaBlend; +} + +// ******************************************************************************* +// * // * gWinZoneHack // * // ******************************************************************************* Modified: armagetronad/trunk/armagetronad/src/tron/gWinZone.h =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gWinZone.h 2008-02-15 21:27:14 UTC (rev 7948) +++ armagetronad/trunk/armagetronad/src/tron/gWinZone.h 2008-02-15 21:40:57 UTC (rev 7949) @@ -107,6 +107,9 @@ virtual void Render(const eCamera *cam); //!< renders the zone virtual void Render2D(tCoord scale) const; //!< renders the zone + //! returns whether the rendering uses alpha blending (massively, so sorting errors would show) + virtual bool RendersAlpha() const; + inline REAL EvaluateFunctionNow( tFunction const & f ) const; //!< evaluates the given function with lastTime - referenceTime_ as argument inline void SetFunctionNow( tFunction & f, REAL value ) const; //!< makes sure EvaluateFunctionNow() returns the given value }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wrt...@us...> - 2008-02-16 14:18:23
|
Revision: 7954 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7954&view=rev Author: wrtlprnft Date: 2008-02-16 06:18:24 -0800 (Sat, 16 Feb 2008) Log Message: ----------- Added an option to enable/disable explosions on the minimap Modified Paths: -------------- armagetronad/trunk/armagetronad/language/english_base.txt armagetronad/trunk/armagetronad/src/tron/gExplosion.cpp armagetronad/trunk/armagetronad/src/tron/gMenus.cpp Modified: armagetronad/trunk/armagetronad/language/english_base.txt =================================================================== --- armagetronad/trunk/armagetronad/language/english_base.txt 2008-02-16 13:08:54 UTC (rev 7953) +++ armagetronad/trunk/armagetronad/language/english_base.txt 2008-02-16 14:18:24 UTC (rev 7954) @@ -1948,6 +1948,9 @@ pref_explosion_text Explosion: pref_explosion_help Toggles the explosion animation when a cycle crashes. +pref_explosion_hud_text Explosion (minimap): +pref_explosion_hud_help Toggles the display of the explosion animation on the minimap. + pref_skymove_text Sky Movement: pref_skymove_help Toggles the animation of the lower sky plane. Modified: armagetronad/trunk/armagetronad/src/tron/gExplosion.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gExplosion.cpp 2008-02-16 13:08:54 UTC (rev 7953) +++ armagetronad/trunk/armagetronad/src/tron/gExplosion.cpp 2008-02-16 14:18:24 UTC (rev 7954) @@ -359,6 +359,7 @@ static tInitExit ie_exp(&init_exp); bool sg_crashExplosion = true; +bool sg_crashExplosionHud = true; #ifndef DEDICATED void gExplosion::Render(const eCamera *cam){ @@ -449,7 +450,7 @@ void gExplosion::Render2D(tCoord scale) const { #ifndef DEDICATED - if(sg_crashExplosion){ + if(sg_crashExplosionHud){ REAL a1=(lastTime-createTime)+.01f;//+.2; REAL e=a1-1; @@ -466,7 +467,6 @@ glPushMatrix(); glTranslatef(pos.x,pos.y,0); - //glDisable(GL_TEXTURE); glDisable(GL_TEXTURE_2D); glColor4f(explosion_r,explosion_g,explosion_b,fade); Modified: armagetronad/trunk/armagetronad/src/tron/gMenus.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gMenus.cpp 2008-02-16 13:08:54 UTC (rev 7953) +++ armagetronad/trunk/armagetronad/src/tron/gMenus.cpp 2008-02-16 14:18:24 UTC (rev 7954) @@ -459,6 +459,8 @@ extern bool sg_crashExplosion; // from gExplosion.cpp static tConfItem<bool> crexp("EXPLOSION",sg_crashExplosion); +extern bool sg_crashExplosionHud; // from gExplosion.cpp +static tConfItem<bool> crexph("EXPLOSION_HUD",sg_crashExplosionHud); #ifndef DEDICATED //extern bool png_screenshot; // from rSysdep.cpp @@ -517,6 +519,11 @@ "$pref_skymove_help", sr_skyWobble); +static uMenuItemToggle crexph2 +(&screen_menu_prefs,"$pref_explosion_hud_text", + "$pref_explosion_hud_help", + sg_crashExplosionHud); + static uMenuItemToggle crexp2 (&screen_menu_prefs,"$pref_explosion_text", "$pref_explosion_help", This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wrt...@us...> - 2008-02-17 08:51:51
|
Revision: 7972 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7972&view=rev Author: wrtlprnft Date: 2008-02-17 00:51:57 -0800 (Sun, 17 Feb 2008) Log Message: ----------- Added support for widgets with arbitrary start and end angles and included a small analog clock in the default cockpit to show how it can be used. Hi there Self_Destructo. Modified Paths: -------------- armagetronad/trunk/armagetronad/resource/proto/Anonymous/original/original.cockpit.xml armagetronad/trunk/armagetronad/resource/proto/cockpit.dtd armagetronad/trunk/armagetronad/src/tron/cockpit/cGauges.cpp armagetronad/trunk/armagetronad/src/tron/cockpit/cGauges.h armagetronad/trunk/armagetronad/src/tron/cockpit/cWidgetBase.cpp armagetronad/trunk/armagetronad/src/tron/cockpit/cWidgetBase.h Modified: armagetronad/trunk/armagetronad/resource/proto/Anonymous/original/original.cockpit.xml =================================================================== --- armagetronad/trunk/armagetronad/resource/proto/Anonymous/original/original.cockpit.xml 2008-02-17 07:36:10 UTC (rev 7971) +++ armagetronad/trunk/armagetronad/resource/proto/Anonymous/original/original.cockpit.xml 2008-02-17 08:51:57 UTC (rev 7972) @@ -10,6 +10,7 @@ <AtomicData field="minimum" source="0" /> <AtomicData field="maximum" source="max_speed" /> </DataSet> + <Angles min="85" max="95" /> <Position x="-0.165" y="-0.9" /> <Size height="0.15" width="0.15" /> <ShowCurrent value="true" /> @@ -201,6 +202,77 @@ </Table> </Face> </Label> + <NeedleGauge viewport="top"> + <DataSet> + <AtomicData field="source" source="current_seconds" /> + <AtomicData field="minimum" source="0" /> + <AtomicData field="maximum" source="60" /> + </DataSet> + <Angles min="-270" max="90" /> + <Position x=".85" y=".2" /> + <Size height="0.075" width="0.075" /> + <ShowCurrent value="false" /> + <ShowMaximum value="false" /> + <ShowMinimum value="false" /> + <Caption location="off"> + <Text value="Time" /> + </Caption> + <Foreground> + <Solid> + <Color r="1." g="0." b="0." alpha="1." /> + </Solid> + </Foreground> + </NeedleGauge> + <NeedleGauge viewport="top"> + <DataSet> + <Math lvalue="current_minutes" type="sum" field="source"> + <RValue> + <Math rvalue="0.01666666" type="product" lvalue="current_seconds" /> + </RValue> + </Math> + <AtomicData field="minimum" source="0" /> + <AtomicData field="maximum" source="60" /> + </DataSet> + <Angles min="-270" max="90" /> + <Position x=".85" y=".2" /> + <Size height="0.075" width="0.075" /> + <ShowCurrent value="false" /> + <ShowMaximum value="false" /> + <ShowMinimum value="false" /> + <Caption location="off"> + <Text value="Time" /> + </Caption> + <Foreground> + <Solid> + <Color r="0." g="1." b="0." alpha="1." /> + </Solid> + </Foreground> + </NeedleGauge> + <NeedleGauge viewport="top"> + <DataSet> + <Math lvalue="current_hours12h" type="sum" field="source"> + <RValue> + <Math rvalue="0.01666666" type="product" lvalue="current_minutes" /> + </RValue> + </Math> + <AtomicData field="minimum" source="0" /> + <AtomicData field="maximum" source="12" /> + </DataSet> + <Angles min="-270" max="90" /> + <Position x=".85" y=".2" /> + <Size height="0.05" width="0.05" /> + <ShowCurrent value="false" /> + <ShowMaximum value="false" /> + <ShowMinimum value="false" /> + <Caption location="off"> + <Text value="Time" /> + </Caption> + <Foreground> + <Solid> + <Color r="0." g="0." b="1." alpha="1." /> + </Solid> + </Foreground> + </NeedleGauge> <Label camera="^in" viewport="top"> <DataSet id="hours"> <AtomicData source="current_hours12h" minwidth="2" fill="0" /> Modified: armagetronad/trunk/armagetronad/resource/proto/cockpit.dtd =================================================================== --- armagetronad/trunk/armagetronad/resource/proto/cockpit.dtd 2008-02-17 07:36:10 UTC (rev 7971) +++ armagetronad/trunk/armagetronad/resource/proto/cockpit.dtd 2008-02-17 08:51:57 UTC (rev 7972) @@ -28,6 +28,7 @@ ShowMaximum | ShowMinimum | Reverse | + Angles | Caption | Background | Foreground | @@ -77,6 +78,7 @@ ShowMaximum | ShowMinimum | Reverse | + Angles | Caption | Background | Foreground @@ -154,6 +156,10 @@ <!ELEMENT Reverse EMPTY> <!ATTLIST Reverse value (true | false) "true"> +<!ELEMENT Angles EMPTY> +<!ATTLIST Angles min CDATA "0"> +<!ATTLIST Angles max CDATA "180"> + <!ELEMENT Caption (Text?) > <!ATTLIST Caption location (top | bottom | off) "bottom"> Modified: armagetronad/trunk/armagetronad/src/tron/cockpit/cGauges.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/cockpit/cGauges.cpp 2008-02-17 07:36:10 UTC (rev 7971) +++ armagetronad/trunk/armagetronad/src/tron/cockpit/cGauges.cpp 2008-02-17 08:51:57 UTC (rev 7972) @@ -36,6 +36,7 @@ bool BarGauge::Process(tXmlParser::node cur) { if ( + WithAngles ::Process(cur) || WithSingleData ::Process(cur) || WithBackground ::Process(cur) || WithForeground ::Process(cur) || @@ -178,9 +179,11 @@ void NeedleGauge::RenderGraph(float min, float max, float val, float factor, tValue::Base const &val_s) { - float x, y=0.0; - x= (m_reverse?-1:1) * cos(M_PI*val/max); - y= sin(M_PI*val/max); + float x, y; + float t = m_reverse ? (val - max) / (min - max) : (val - min) / (max - min); + float a = m_angle_min * (1 - t) + m_angle_max * t; + x= cos(a); + y= sin(a); /* Draws an ugly background on the gauge BeginQuads(); Modified: armagetronad/trunk/armagetronad/src/tron/cockpit/cGauges.h =================================================================== --- armagetronad/trunk/armagetronad/src/tron/cockpit/cGauges.h 2008-02-17 07:36:10 UTC (rev 7971) +++ armagetronad/trunk/armagetronad/src/tron/cockpit/cGauges.h 2008-02-17 08:51:57 UTC (rev 7972) @@ -40,7 +40,7 @@ namespace cWidget { //! Processes and renders a bar gauge -class BarGauge : public WithSingleData, public WithBackground, public WithForeground, public WithCoordinates, public WithShowSettings, public WithCaption, public WithReverse { +class BarGauge : public WithSingleData, public WithBackground, public WithForeground, public WithCoordinates, public WithShowSettings, public WithCaption, public WithReverse, public WithAngles { public: virtual ~BarGauge() { }; //!< Do- nothing destructor void Render(); //!< Renders the gauge Modified: armagetronad/trunk/armagetronad/src/tron/cockpit/cWidgetBase.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/cockpit/cWidgetBase.cpp 2008-02-17 07:36:10 UTC (rev 7971) +++ armagetronad/trunk/armagetronad/src/tron/cockpit/cWidgetBase.cpp 2008-02-17 08:51:57 UTC (rev 7972) @@ -508,6 +508,17 @@ return Base::Process(cur); } +bool WithAngles::Process(tXmlParser::node cur) { + if(cur.IsOfType("Angles")) { + cur.GetProp("min", m_angle_min); + cur.GetProp("max", m_angle_max); + m_angle_min *= M_PI / 180.; + m_angle_max *= M_PI / 180.; + return true; + } + return Base::Process(cur); +} + bool WithShowSettings::Process(tXmlParser::node cur) { if(cur.IsOfType("ShowMinimum")) { m_showmin = cur.GetPropBool("value"); Modified: armagetronad/trunk/armagetronad/src/tron/cockpit/cWidgetBase.h =================================================================== --- armagetronad/trunk/armagetronad/src/tron/cockpit/cWidgetBase.h 2008-02-17 07:36:10 UTC (rev 7971) +++ armagetronad/trunk/armagetronad/src/tron/cockpit/cWidgetBase.h 2008-02-17 08:51:57 UTC (rev 7972) @@ -204,6 +204,16 @@ bool Process(tXmlParser::node cur); //!< Processes a Reverse node or passes on to Base::Process }; +//! Able to parse and store an Angles node +class WithAngles : virtual public Base{ +protected: + float m_angle_min; //!< Stores the angle at the minimum value + float m_angle_max; //!< Stores the angle at the minimum value + WithAngles() : m_angle_min(0), m_angle_max(M_PI){}; //!< Default constructor +public: + bool Process(tXmlParser::node cur); //!< Processes an Angles node or passes on to Base::Process +}; + //! Able to parse and store ShowMinimum, ShowMaximum or ShowValue nodes class WithShowSettings : virtual public Base{ protected: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <z-...@us...> - 2008-02-17 11:17:51
|
Revision: 7977 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7977&view=rev Author: z-man Date: 2008-02-17 03:17:57 -0800 (Sun, 17 Feb 2008) Log Message: ----------- Merging branch 0.2.8 from revision 7958 to 7976: ------------------------------------------------------------------------ r7976 | bazaarmagetron | 2008-02-17 12:09:34 +0100 (Sun, 17 Feb 2008) | 2 lines Manuel Moos: Fixed moviepack cycle rendering. ------------------------------------------------------------------------ r7975 | bazaarmagetron | 2008-02-17 11:59:24 +0100 (Sun, 17 Feb 2008) | 2 lines Manuel Moos: Fixed moviepack wall rendering. ------------------------------------------------------------------------ r7967 | bazaarmagetron | 2008-02-17 00:39:53 +0100 (Sun, 17 Feb 2008) | 2 lines Manuel Moos: Added forgotten config item. ------------------------------------------------------------------------ r7966 | bazaarmagetron | 2008-02-17 00:39:22 +0100 (Sun, 17 Feb 2008) | 2 lines Manuel Moos: Longer timout for machines: they always are kept alive at least 5 minutes. ------------------------------------------------------------------------ r7965 | bazaarmagetron | 2008-02-16 23:56:43 +0100 (Sat, 16 Feb 2008) | 2 lines Manuel Moos: Giving glyphs the right orientation so they don't get invisible when nobody else bothers to disable backface culling. ------------------------------------------------------------------------ r7964 | bazaarmagetron | 2008-02-16 23:45:06 +0100 (Sat, 16 Feb 2008) | 2 lines Manuel Moos: Added UNSUSPEND. ------------------------------------------------------------------------ r7963 | bazaarmagetron | 2008-02-16 23:39:14 +0100 (Sat, 16 Feb 2008) | 2 lines Manuel Moos: added SUSPEND command that forces a player so spectate for some rounds. ------------------------------------------------------------------------ r7962 | bazaarmagetron | 2008-02-16 22:14:50 +0100 (Sat, 16 Feb 2008) | 2 lines Manuel Moos: Allow canceling the current display list; use that when textures are loaded. Previously, the texture upload was also recorded in the display list, which was a waste of memory. ------------------------------------------------------------------------ r7960 | wrtlprnft | 2008-02-16 17:45:03 +0100 (Sat, 16 Feb 2008) | 2 lines if i already have to see all these errors at least make them a bit more descriptive. ------------------------------------------------------------------------ Revision Links: -------------- http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7958&view=rev Modified Paths: -------------- armagetronad/trunk/armagetronad/config/settings_dedicated.cfg armagetronad/trunk/armagetronad/language/english_base.txt armagetronad/trunk/armagetronad/src/engine/eAdvWall.cpp armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp armagetronad/trunk/armagetronad/src/engine/ePlayer.h armagetronad/trunk/armagetronad/src/engine/eTeam.cpp armagetronad/trunk/armagetronad/src/network/nNetwork.cpp armagetronad/trunk/armagetronad/src/render/rDisplayList.cpp armagetronad/trunk/armagetronad/src/render/rDisplayList.h armagetronad/trunk/armagetronad/src/render/rFont.cpp armagetronad/trunk/armagetronad/src/render/rGL.cpp armagetronad/trunk/armagetronad/src/render/rModel.cpp armagetronad/trunk/armagetronad/src/render/rModel.h armagetronad/trunk/armagetronad/src/render/rTexture.cpp armagetronad/trunk/armagetronad/src/tron/gWall.cpp Modified: armagetronad/trunk/armagetronad/config/settings_dedicated.cfg =================================================================== --- armagetronad/trunk/armagetronad/config/settings_dedicated.cfg 2008-02-17 11:09:34 UTC (rev 7976) +++ armagetronad/trunk/armagetronad/config/settings_dedicated.cfg 2008-02-17 11:17:57 UTC (rev 7977) @@ -187,6 +187,7 @@ VOTING_PRIVACY 1 # level of secrecy of the votes. 2 makes the vote as secret as possible, -2 makes it fully public. VOTING_SPAM_ISSUE 1 # spam level for issuing a vote VOTING_SPAM_REJECT 5 # spam level for issuing a vote that gets rejected +VOTING_MATURITY 300 # minimum time in seconds a player needs to be online with the same name before he can issue votes MIN_VOTERS 3 # number of voters that need to be online to enable voting Modified: armagetronad/trunk/armagetronad/language/english_base.txt =================================================================== --- armagetronad/trunk/armagetronad/language/english_base.txt 2008-02-17 11:09:34 UTC (rev 7976) +++ armagetronad/trunk/armagetronad/language/english_base.txt 2008-02-17 11:17:57 UTC (rev 7977) @@ -801,6 +801,9 @@ players_help Prints list of currently active players kill_help Kill a specific player (as warning before a kick) silence_help Silence a specific player so he can't use public chat any more (/msg and /team still work) +suspend_help Suspend a player from playing for the following N rounds (default: 5) +unsuspend_help Removes a player suspension. + voice_help Reverse of SILENCE allow_team_change_player_help Allow a specific player to change teams even if ALLOW_TEAM_CHANGE is disabled disallow_team_change_player_help Reverse of ALLOW_TEAM_CHANGE_PLAYER @@ -2184,6 +2187,9 @@ player_win_hole \1 got \2 points for a sacrifice for the good of the team.\n player_lose_hole 0xffff00ZOMG! 0xff7f00HOLER!!1!!0xRESETT \1 lost \2 points for being a cheap ass lamer.\n +player_no_longer_suspended \1 0x77ff77is allowed to play again.\n +player_suspended \1 0xff7777is banned to spectator mode for \2 round(s).\n + zone_collapse_harmless \1's zone collapses harmlessly for lack of enemy contacts.\n #******************************************** Modified: armagetronad/trunk/armagetronad/src/engine/eAdvWall.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/engine/eAdvWall.cpp 2008-02-17 11:09:34 UTC (rev 7976) +++ armagetronad/trunk/armagetronad/src/engine/eAdvWall.cpp 2008-02-17 11:17:57 UTC (rev 7977) @@ -154,7 +154,6 @@ ( se_RimWrapY ? se_RimWallWrap : se_RimWallNoWrap).Select(); } - BeginQuads(); for(int i=se_rimWalls.Len()-1;i>=0;i--){ se_rimWalls(i)->RenderReal( rDisplayList::IsRecording() ? 0 : camera ); } Modified: armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp 2008-02-17 11:09:34 UTC (rev 7976) +++ armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp 2008-02-17 11:17:57 UTC (rev 7977) @@ -3694,6 +3694,7 @@ r = g = b = 15; + suspended_ = 0; greeted = true; chatting_ = false; spectating_ = false; @@ -3761,6 +3762,7 @@ // default access level lastAccessLevel = tAccessLevel_Default; + suspended_ = 0; greeted =false; chatting_ =false; spectating_ =false; @@ -5985,7 +5987,7 @@ // ******************* bool ePlayerNetID::TeamChangeAllowed() const { - return ( allowTeamChange_ || se_allowTeamChanges ) + return ( allowTeamChange_ || se_allowTeamChanges ) && ( suspended_ == 0 ) #ifdef KRAWALL_SERVER // only allow players with enough access level to enter the game, everyone is free to leave, though && ( GetAccessLevel() <= AccessLevelRequiredToPlay() || CurrentTeam() ) @@ -6642,6 +6644,43 @@ static tConfItemFunc kill_conf("KILL",&Kill_conf); static tAccessLevelSetter se_killConfLevel( kill_conf, tAccessLevel_Moderator ); +static void Suspend_conf_base(std::istream &s, int rounds ) +{ + if ( se_NeedsServer( "SUSPEND", s, false ) ) + { + return; + } + + ePlayerNetID * p = ReadPlayer( s ); + + if ( rounds > 0 ) + { + s >> rounds; + } + + if ( p ) + { + p->Suspend( rounds ); + } +} + +static void Suspend_conf(std::istream &s ) +{ + Suspend_conf_base( s, 5 ); +} + + +static void UnSuspend_conf(std::istream &s ) +{ + Suspend_conf_base( s, 5 ); +} + +static tConfItemFunc suspend_conf("SUSPEND",&Suspend_conf); +static tAccessLevelSetter se_suspendConfLevel( suspend_conf, tAccessLevel_Moderator ); + +static tConfItemFunc unsuspend_conf("UNSUSPEND",&UnSuspend_conf); +static tAccessLevelSetter se_unsuspendConfLevel( unsuspend_conf, tAccessLevel_Moderator ); + static void Silence_conf(std::istream &s) { if ( se_NeedsServer( "SILENCE", s ) ) @@ -7269,6 +7308,42 @@ // ******************************************************************************* // * +// * Suspend +// * +// ******************************************************************************* +//! +//! @param rounds number of rounds to suspend +//! +// ******************************************************************************* + +void ePlayerNetID::Suspend( int rounds ) +{ + if ( rounds < 0 ) + { + rounds = 0; + } + + if ( suspended_ == rounds ) + { + return; + } + + suspended_ = rounds; + + if ( suspended_ == 0 ) + { + sn_ConsoleOut( tOutput( "$player_no_longer_suspended", GetName() ) ); + FindDefaultTeam(); + } + else + { + sn_ConsoleOut( tOutput( "$player_suspended", GetName(), suspended_ ) ); + SetTeam( NULL ); + } +} + +// ******************************************************************************* +// * // * LogScoreDifferences // * // ******************************************************************************* @@ -7282,6 +7357,19 @@ { ePlayerNetID* p = se_PlayerNetIDs(i); p->LogScoreDifference(); + + // update suspension count + if ( p->suspended_ > 0 ) + { + if ( p->CurrentTeam() && !p->NextTeam() ) + { + p->UpdateTeam(); + } + else + { + p->Suspend( p->suspended_ - 1 ); + } + } } } Modified: armagetronad/trunk/armagetronad/src/engine/ePlayer.h =================================================================== --- armagetronad/trunk/armagetronad/src/engine/ePlayer.h 2008-02-17 11:09:34 UTC (rev 7976) +++ armagetronad/trunk/armagetronad/src/engine/ePlayer.h 2008-02-17 11:17:57 UTC (rev 7977) @@ -175,6 +175,7 @@ ePlayerNetID& operator= (const ePlayerNetID&); // forbid copy constructor + int suspended_; //! number of rounds the player is currently suspended from playing bool spectating_; //!< are we currently spectating? Spectators don't get assigned to teams. bool stealth_; //!< does this player want to hide his/her identity? bool chatting_; //!< are we currently chatting? @@ -275,6 +276,8 @@ void Greet(); + // suspend the player from playing, forcing him to spectate + void Suspend( int rounds = 5 ); #ifdef KRAWALL_SERVER void Authenticate( tString const & authName, tAccessLevel accessLevel = tAccessLevel_Authenticated, Modified: armagetronad/trunk/armagetronad/src/engine/eTeam.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/engine/eTeam.cpp 2008-02-17 11:09:34 UTC (rev 7976) +++ armagetronad/trunk/armagetronad/src/engine/eTeam.cpp 2008-02-17 11:17:57 UTC (rev 7977) @@ -1022,6 +1022,10 @@ if ( !player->IsHuman() ) return true; + // suspended players cannot join + if ( player->suspended_ > 0 ) + return true; + // check for invitations. Not with those shoes! if ( IsLocked() && !IsInvited( player ) ) { Modified: armagetronad/trunk/armagetronad/src/network/nNetwork.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/network/nNetwork.cpp 2008-02-17 11:09:34 UTC (rev 7976) +++ armagetronad/trunk/armagetronad/src/network/nNetwork.cpp 2008-02-17 11:17:57 UTC (rev 7977) @@ -4225,7 +4225,6 @@ // iterate over known machines nMachineMap & map = sn_GetMachineMap(); nMachineMap::iterator toErase = map.end(); - int size = map.size(); for( nMachineMap::iterator iter = map.begin(); iter != map.end(); ++iter ) { // erase last deleted machine @@ -4241,7 +4240,7 @@ } // if the machine is no longer in use, mark it for deletion - if ( machine.players_ == 0 && machine.lastUsed_ < time - 300.0/size && machine.banned_ < time && machine.kph_.GetAverage() < 0.5 ) + if ( machine.players_ == 0 && machine.lastUsed_ < time - 300.0 && machine.banned_ < time && machine.kph_.GetAverage() < 0.5 ) toErase = iter; } Modified: armagetronad/trunk/armagetronad/src/render/rDisplayList.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/render/rDisplayList.cpp 2008-02-17 11:09:34 UTC (rev 7976) +++ armagetronad/trunk/armagetronad/src/render/rDisplayList.cpp 2008-02-17 11:17:57 UTC (rev 7977) @@ -87,12 +87,12 @@ #endif } -static bool sr_isRecording = false; +static rDisplayListFiller * sr_currentFiller = NULL; //! check whether a displaylist is currently being recorded. bool rDisplayList::IsRecording() { - return sr_isRecording; + return sr_currentFiller; } // calls the display list, returns true if there was a list to call @@ -171,6 +171,18 @@ #endif } +// cancels recording of current display list +void rDisplayList::Cancel() +{ +#ifndef DEDICATED + if ( sr_currentFiller ) + { + sr_currentFiller->list_.Clear(0); + sr_currentFiller->Stop(); + } +#endif +} + rDisplayListAlphaSensitive::rDisplayListAlphaSensitive() : lastAlpha_( sr_alphaBlend ) {} @@ -200,7 +212,7 @@ void rDisplayListFiller::Start() { #ifndef DEDICATED - bool useList = sr_useDisplayLists != rDisplayList_Off && list_.inhibit_ == 0 && !sr_isRecording; + bool useList = sr_useDisplayLists != rDisplayList_Off && list_.inhibit_ == 0 && !sr_currentFiller; if ( useList ) { #ifdef LIST_STATS @@ -213,7 +225,7 @@ } glNewList(list_.list_, sr_useDisplayLists == rDisplayList_CAC ? GL_COMPILE : GL_COMPILE_AND_EXECUTE ); list_.filling_ = true; - sr_isRecording = true; + sr_currentFiller = this; } else if ( list_.inhibit_ > 0 ) { @@ -221,7 +233,7 @@ } #ifdef LIST_STATS - if ( !useList && !sr_isRecording ) + if ( !useList && !sr_currentFiller ) { sr_counter.Count( rListCounter::Not ); } @@ -241,8 +253,9 @@ if ( list_.filling_ ) { tASSERT( list_.list_ ); + tASSERT( sr_currentFiller == this ); - sr_isRecording = false; + sr_currentFiller = 0; list_.filling_ = false; glEndList(); Modified: armagetronad/trunk/armagetronad/src/render/rDisplayList.h =================================================================== --- armagetronad/trunk/armagetronad/src/render/rDisplayList.h 2008-02-17 11:09:34 UTC (rev 7976) +++ armagetronad/trunk/armagetronad/src/render/rDisplayList.h 2008-02-17 11:17:57 UTC (rev 7977) @@ -98,6 +98,8 @@ //! clears all display lists static void ClearAll(); + //! cancels recording of the current display list + static void Cancel(); protected: //! calls the display list, returns true if there was a list to call virtual bool OnCall(); @@ -128,6 +130,7 @@ //! create an object of this type to fill a display list while you render class rDisplayListFiller { + friend class rDisplayList; public: //! constructor, automatically starting to fill teh list explicit rDisplayListFiller( rDisplayList & list ); Modified: armagetronad/trunk/armagetronad/src/render/rFont.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/render/rFont.cpp 2008-02-17 11:09:34 UTC (rev 7976) +++ armagetronad/trunk/armagetronad/src/render/rFont.cpp 2008-02-17 11:17:57 UTC (rev 7977) @@ -170,16 +170,16 @@ select = select->lowerPart; } select->Select(true); - + BeginQuads(); - glTexCoord2f(tleft,ttop); - glVertex2f( left, top); + glTexCoord2f(tright,tbot); + glVertex2f( right, bot); glTexCoord2f(tright,ttop); glVertex2f( right ,top); - glTexCoord2f(tright,tbot); - glVertex2f( right, bot); + glTexCoord2f(tleft,ttop); + glVertex2f( left, top); glTexCoord2f(tleft,tbot); glVertex2f( left, bot); @@ -448,13 +448,14 @@ //sr_ResetRenderState(true); BeginQuads(); - glVertex2f( l, t); - glVertex2f( r ,t); + glVertex2f( l, b); glVertex2f( r, b); - glVertex2f( l, b); + glVertex2f( r ,t); + + glVertex2f( l, t); RenderEnd(); } else Modified: armagetronad/trunk/armagetronad/src/render/rGL.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/render/rGL.cpp 2008-02-17 11:09:34 UTC (rev 7976) +++ armagetronad/trunk/armagetronad/src/render/rGL.cpp 2008-02-17 11:17:57 UTC (rev 7977) @@ -38,7 +38,7 @@ if ( error != GL_NO_ERROR ) { std::stringstream s; - s << "GL error 0X" << std::hex << error << "\n"; + s << "GL error 0X" << std::hex << error << " (" << (char const *)gluErrorString(error) << ")\n"; con << s.str(); // catch a breakpoint Modified: armagetronad/trunk/armagetronad/src/render/rModel.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/render/rModel.cpp 2008-02-17 11:09:34 UTC (rev 7976) +++ armagetronad/trunk/armagetronad/src/render/rModel.cpp 2008-02-17 11:17:57 UTC (rev 7977) @@ -55,6 +55,7 @@ void rModel::Load(std::istream &in,const char *fileName){ #ifndef DEDICATED + modelTexFacesCoherent = false; bool calc_normals=true; if (strstr(fileName,".mod")){ // old loader @@ -102,6 +103,7 @@ Vec3 &v = vertices[i]; texVert[i] = Vec3((v.x[0]-xmin)/(xmax-xmin), (zmax-v.x[2])/(zmax-zmin), 0); } + modelTexFacesCoherent = true; for (i = modelFaces.Len()-1; i>=0; i--) { modelTexFaces[i] = modelFaces[i]; @@ -275,22 +277,16 @@ return; if ( !displayList_.Call() ) { - rDisplayListFiller filler( displayList_ ); + // model display lists should definitely be compiled before other lists + rDisplayList::Cancel(); - glEnable(GL_CULL_FACE); - - if (normals.Len()>=vertices.Len()){ - glNormalPointer(GL_FLOAT,0,&normals[0]); - glEnableClientState(GL_NORMAL_ARRAY); - } - glVertexPointer(3,GL_FLOAT,0,&vertices[0]); - glEnableClientState(GL_VERTEX_ARRAY); - bool texcoord=true; if (texVert.Len()<0) texcoord=false; if (modelTexFaces.Len()!=modelFaces.Len()) texcoord=false; + if ( !modelTexFacesCoherent ) + texcoord=false; if (texcoord) { @@ -298,29 +294,42 @@ glEnableClientState(GL_TEXTURE_COORD_ARRAY); } - #if 0 - if( 0 ) + rDisplayListFiller filler( displayList_ ); + + glEnable(GL_CULL_FACE); + + if ( !modelTexFacesCoherent ) { - // dead code, but maybe glDrawElements does not work for someone, - // so we keep it + // sigh, we need to do it the complicated way glBegin( GL_TRIANGLES ); for(int i=modelFaces.Len()-1;i>=0;i--) { for(int j=0;j<=2;j++) { - // glTexCoord3fv(reinterpret_cast<REAL *>(&(texVert(modelTexFaces(i).A[j])))); - glArrayElement(modelFaces(i).A[j]); + glTexCoord3fv(reinterpret_cast<REAL *>(&(texVert(modelTexFaces(i).A[j])))); + glNormal3fv(reinterpret_cast<REAL *>(&(normals(modelFaces(i).A[j])))); + glVertex3fv(reinterpret_cast<REAL *>(&(vertices(modelFaces(i).A[j])))); } } glEnd(); } - #endif + else + { + // glDrawElements works + if (normals.Len()>=vertices.Len()) + { + glNormalPointer(GL_FLOAT,0,&normals[0]); + glEnableClientState(GL_NORMAL_ARRAY); + } + glVertexPointer(3,GL_FLOAT,0,&vertices[0]); + glEnableClientState(GL_VERTEX_ARRAY); - glDrawElements(GL_TRIANGLES, - modelFaces.Len()*3, - GL_UNSIGNED_INT, - &modelFaces(0)); + glDrawElements(GL_TRIANGLES, + modelFaces.Len()*3, + GL_UNSIGNED_INT, + &modelFaces(0)); + } glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisableClientState(GL_VERTEX_ARRAY); Modified: armagetronad/trunk/armagetronad/src/render/rModel.h =================================================================== --- armagetronad/trunk/armagetronad/src/render/rModel.h 2008-02-17 11:09:34 UTC (rev 7976) +++ armagetronad/trunk/armagetronad/src/render/rModel.h 2008-02-17 11:17:57 UTC (rev 7977) @@ -66,6 +66,7 @@ tArray<Vec3> normals; tArray<rModelFace> modelFaces; tArray<rModelFace> modelTexFaces; + bool modelTexFacesCoherent; // if modelFaces and modelTexFaces are identical void Load(std::istream &s,const char *fileName); public: rModel(const char *fileName,const char *fileName_alt=""); Modified: armagetronad/trunk/armagetronad/src/render/rTexture.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/render/rTexture.cpp 2008-02-17 11:09:34 UTC (rev 7976) +++ armagetronad/trunk/armagetronad/src/render/rTexture.cpp 2008-02-17 11:17:57 UTC (rev 7977) @@ -536,7 +536,7 @@ #ifndef DEDICATED if(sr_glOut) { - sr_CheckGLError(); + RenderEnd(true); int texmod=rTextureGroups::TextureMode[group_]; if (enforce && texmod<0) texmod=GL_NEAREST_MIPMAP_NEAREST; @@ -548,7 +548,8 @@ // std::cerr << "loading texture " << fileName << ':' << tint << "\n"; if (texmod>0){ - RenderEnd(true); + // don't generate textures inside display lists + rDisplayList::Cancel(); glBindTexture(GL_TEXTURE_2D,tint_); Modified: armagetronad/trunk/armagetronad/src/tron/gWall.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gWall.cpp 2008-02-17 11:09:34 UTC (rev 7976) +++ armagetronad/trunk/armagetronad/src/tron/gWall.cpp 2008-02-17 11:17:57 UTC (rev 7977) @@ -200,6 +200,8 @@ if (sr_upperSky && !sg_MoviePack()) h=upper_height; } + BeginQuads(); + // NOTE: display lists on nvidia cards don't like infinite points if (h<9000 || !sr_infinityPlane || rDisplayList::IsRecording() ){ TexVertex(p1.x, p1.y, 0, @@ -401,6 +403,7 @@ // render shadow Color(0,0,0); + BeginQuads(); Vertex(P1.x, P1.y, 0); Vertex(P2.x, P2.y, 0); Vertex(P4.x, P4.y, 0); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <phi...@us...> - 2008-02-17 17:53:57
|
Revision: 7986 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7986&view=rev Author: philippeqc Date: 2008-02-17 09:54:01 -0800 (Sun, 17 Feb 2008) Log Message: ----------- monitors influence other monitors correctly Modified Paths: -------------- armagetronad/trunk/armagetronad/resource/proto/map-0.3.1-a.dtd armagetronad/trunk/armagetronad/src/Makefile.am armagetronad/trunk/armagetronad/src/tools/tPolynomial.cpp armagetronad/trunk/armagetronad/src/tools/tPolynomial.h armagetronad/trunk/armagetronad/src/tools/unitTest/tPolynomialMarshalerTest.cpp armagetronad/trunk/armagetronad/src/tools/unitTest/tPolynomialTest.cpp armagetronad/trunk/armagetronad/src/tron/gParser.cpp armagetronad/trunk/armagetronad/src/tron/zone/zEffectGroup.cpp armagetronad/trunk/armagetronad/src/tron/zone/zEffectGroup.h armagetronad/trunk/armagetronad/src/tron/zone/zMonitor.cpp armagetronad/trunk/armagetronad/src/tron/zone/zMonitor.h armagetronad/trunk/armagetronad/src/tron/zone/zValidator.cpp armagetronad/trunk/armagetronad/src/tron/zone/zValidator.h armagetronad/trunk/armagetronad/src/tron/zone/zZone.cpp armagetronad/trunk/armagetronad/src/tron/zone/zZoneInfluence.cpp armagetronad/trunk/armagetronad/src/tron/zone/zZoneInfluence.h Modified: armagetronad/trunk/armagetronad/resource/proto/map-0.3.1-a.dtd =================================================================== --- armagetronad/trunk/armagetronad/resource/proto/map-0.3.1-a.dtd 2008-02-17 17:22:53 UTC (rev 7985) +++ armagetronad/trunk/armagetronad/resource/proto/map-0.3.1-a.dtd 2008-02-17 17:54:01 UTC (rev 7986) @@ -146,6 +146,7 @@ <!ELEMENT MonitorInfluence EMPTY> <!ATTLIST MonitorInfluence name CDATA #IMPLIED> <!ATTLIST MonitorInfluence marked (true | false | ignore) "ignore"> +<!ATTLIST MonitorInfluence influence CDATA #IMPLIED> <!ATTLIST MonitorInfluence influenceSlide CDATA #IMPLIED> <!ATTLIST MonitorInfluence influenceAdd CDATA #IMPLIED> <!ATTLIST MonitorInfluence influenceSet CDATA #IMPLIED> @@ -157,6 +158,7 @@ <!ELEMENT Rotation EMPTY> <!ATTLIST Rotation rotationAngle CDATA "0.0"> <!ATTLIST Rotation rotationSpeed CDATA "0.0"> +<!ATTLIST Rotation rotation CDATA "0.0"> <!ELEMENT Scale EMPTY> Modified: armagetronad/trunk/armagetronad/src/Makefile.am =================================================================== --- armagetronad/trunk/armagetronad/src/Makefile.am 2008-02-17 17:22:53 UTC (rev 7985) +++ armagetronad/trunk/armagetronad/src/Makefile.am 2008-02-17 17:54:01 UTC (rev 7986) @@ -87,7 +87,7 @@ tools/tCoord.h\ tools/tValue.h tools/tValueParser.h\ tools/tFunction.h tools/tFunction.cpp\ - tools/tPolynomial.h tools/tPolynomialWithBase.h \ + tools/tPolynomial.h tools/tPolynomial.cpp tools/tPolynomialWithBase.h \ tools/tResource.h tools/tResource.cpp \ tools/tRuby.h tools/tRuby.cpp Modified: armagetronad/trunk/armagetronad/src/tools/tPolynomial.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tools/tPolynomial.cpp 2008-02-17 17:22:53 UTC (rev 7985) +++ armagetronad/trunk/armagetronad/src/tools/tPolynomial.cpp 2008-02-17 17:54:01 UTC (rev 7986) @@ -118,7 +118,7 @@ } -std::string tPolynomialMarshaler::toString() +std::string tPolynomialMarshaler::toString() const { std::ostringstream ostr(""); Modified: armagetronad/trunk/armagetronad/src/tools/tPolynomial.h =================================================================== --- armagetronad/trunk/armagetronad/src/tools/tPolynomial.h 2008-02-17 17:22:53 UTC (rev 7985) +++ armagetronad/trunk/armagetronad/src/tools/tPolynomial.h 2008-02-17 17:54:01 UTC (rev 7986) @@ -57,8 +57,9 @@ { } - virtual REAL evaluate( REAL valueOfVariable ) const; //!< evaluates the function - inline REAL operator()( REAL valueOfVariable ) const; //!< evaluation operator + virtual REAL evaluate( REAL currentVarValue ) const; //!< evaluates the function + inline REAL operator()( REAL currentVarValue ) const; //!< evaluation operator + tPolynomial<T> const operator*( REAL constant ) const; tPolynomial<T> const operator*( const tPolynomial<T> & tfRight ) const ; tPolynomial<T> const operator+( REAL constant ) const ; @@ -76,11 +77,11 @@ } coefs[0] += constant; } - tPolynomial<T> evaluateCoefsAt(REAL valueOfVariable) const; - void changeRate(REAL newRate, int newRateLength, REAL valueOfVariable); + tPolynomial<T> adaptToNewReferenceVarValue(REAL currentVarValue) const; + void changeRate(REAL newRate, int newRateLength, REAL currentVarValue); - void setRates(REAL newValues[], int newValuesLength, REAL valueOfVariable); - void setRates(tArray<REAL> newValues, REAL valueOfVariable); + void setRates(REAL newValues[], int newValuesLength, REAL currentVarValue); + void setRates(tArray<REAL> newValues, REAL currentVarValue); virtual T & ReadSync( T & m ); virtual T & WriteSync( T & m ) const; @@ -90,20 +91,22 @@ template<typename D> friend bool operator != (const tPolynomial<D> & left, const tPolynomial<D> & right); - virtual void toString() const; - tPolynomial<T> const clamp(REAL min, REAL max, REAL valueOfVariable); + virtual std::string toString() const; + tPolynomial<T> const clamp(REAL min, REAL max, REAL currentVarValue); int Len() const{ return coefs.Len(); }; + + void setAtSameReferenceVarValue(const tPolynomial<T> & other); protected: - void setBaseValueOfVariable(REAL newBaseValueOfVariable) { - baseValueOfVariable = newBaseValueOfVariable; + void setReferenceVarValue(REAL newReferenceVarValue) { + referenceVarValue = newReferenceVarValue; } void growCoefsArray(int newLength); // Variables - REAL baseValueOfVariable; //!< the evaluation is always done on (valueOfVariable - baseValueOfVariable) rather than (valueOfVariable) + REAL referenceVarValue; //!< the evaluation is always done on (currentVarValue - referenceVarValue) rather than (currentVarValue) tArray<REAL> coefs; }; @@ -126,7 +129,7 @@ template<typename D> tPolynomial<D> const marshal(const tPolynomial<D> & other); - std::string toString(); + std::string toString() const; friend bool operator == (const tPolynomialMarshaler & left, const tPolynomialMarshaler & right); // template<typename D> @@ -158,7 +161,7 @@ template <typename T> tPolynomial<T>::tPolynomial(int count) //!< constructor - : baseValueOfVariable(0.0), + : referenceVarValue(0.0), coefs(count) { // Initialise to all 0's @@ -168,7 +171,7 @@ template <typename T> tPolynomial<T>::tPolynomial() //!< constructor - : baseValueOfVariable(0.0), + : referenceVarValue(0.0), coefs(0) { // Empty @@ -176,7 +179,7 @@ template <typename T> tPolynomial<T>::tPolynomial(REAL newCoefs[], int count) //!< constructor - : baseValueOfVariable(0.0), + : referenceVarValue(0.0), coefs(count) { for (int i=0; i<coefs.Len(); i++) @@ -185,7 +188,7 @@ template <typename T> tPolynomial<T>::tPolynomial(REAL value) //!< constructor for constant polynomial - : baseValueOfVariable(0.0), + : referenceVarValue(0.0), coefs(1) { coefs[0] = value; @@ -193,7 +196,7 @@ template <typename T> tPolynomial<T>::tPolynomial(tArray<REAL> newCoefs) //!< constructor - : baseValueOfVariable(0.0), + : referenceVarValue(0.0), coefs(newCoefs) { // Empty @@ -201,7 +204,7 @@ template <typename T> tPolynomial<T>::tPolynomial(const tPolynomial<T> &tf) //!< constructor - : baseValueOfVariable(tf.baseValueOfVariable), + : referenceVarValue(tf.referenceVarValue), coefs(tf.coefs) { // Empty @@ -218,9 +221,9 @@ // ******************************************************************************* template <typename T> -REAL tPolynomial<T>::operator ( )( REAL valueOfVariable ) const +REAL tPolynomial<T>::operator ( )( REAL currentVarValue ) const { - return evaluate( valueOfVariable ); + return evaluate( currentVarValue ); } // ******************************************************************************* @@ -277,9 +280,9 @@ tPolynomial<T> tRebasedRight; // Do both polynomial have the same baseValue? - if (false == ( fabs(left.baseValueOfVariable - right.baseValueOfVariable) < DELTA)) { + if (false == ( fabs(left.referenceVarValue - right.referenceVarValue) < DELTA)) { // Bring back both polynomial to the same baseValue for easy comparision - tRebasedRight = right.evaluateCoefsAt(left.baseValueOfVariable); + tRebasedRight = right.adaptToNewReferenceVarValue(left.referenceVarValue); } else { // They have similar baseValue, no need to adjust. @@ -330,11 +333,11 @@ * */ template <typename T> -tPolynomial<T> tPolynomial<T>::evaluateCoefsAt(REAL valueOfVariable) const +tPolynomial<T> tPolynomial<T>::adaptToNewReferenceVarValue(REAL currentVarValue) const { tPolynomial<T> tf(*this); - // Compute the coefficients at "valueOfVariable" (var for short) + // Compute the coefficients at "currentVarValue" (var for short) // c0' = c0 + (c1/sum(1))*var + (c2/sum(2))*var^2 + ... + (c[N]/sum(N))*var^N // c1' = c1 + (c2/sum(1))*var + ... + (c[N]/sum(N-1))*var^(N-1) // c2' = c2 + ... + (c[N]/sum(N-2))*var^(N-2) @@ -343,10 +346,10 @@ // c[N] = c[N] // // so: - // [0 , 0 , a] at valueOfVariable=0 will become - // [9a/2, 3a, a] at valueOfVariable=3 + // [0 , 0 , a] at currentVarValue=0 will become + // [9a/2, 3a, a] at currentVarValue=3 - REAL deltaVariableValue = valueOfVariable - baseValueOfVariable; + REAL deltaVariableValue = currentVarValue - referenceVarValue; // Compute for each coefficient their new value for (int coefIndex=0; coefIndex<coefs.Len(); coefIndex++) { @@ -357,7 +360,7 @@ tf.coefs[coefIndex] += newCoefValue; } - tf.setBaseValueOfVariable(valueOfVariable); + tf.setReferenceVarValue(currentVarValue); return tf; } @@ -365,7 +368,7 @@ * */ template <typename T> -void tPolynomial<T>::changeRate(REAL newRate, int newRateIndex, REAL valueOfVariable) +void tPolynomial<T>::changeRate(REAL newRate, int newRateIndex, REAL currentVarValue) { if (coefs.Len() <= newRateIndex) { int oldLength = coefs.Len(); @@ -375,7 +378,7 @@ } } - *this = evaluateCoefsAt(valueOfVariable); + *this = adaptToNewReferenceVarValue(currentVarValue); coefs[newRateIndex] = newRate; } @@ -384,7 +387,7 @@ * This perform a hard setting of all the coefficients */ template <typename T> -void tPolynomial<T>::setRates(REAL newValues[], int newValuesLength, REAL valueOfVariable) +void tPolynomial<T>::setRates(REAL newValues[], int newValuesLength, REAL currentVarValue) { if (coefs.Len() < newValuesLength) { int oldLength = coefs.Len(); @@ -394,7 +397,7 @@ } } - setBaseValueOfVariable(valueOfVariable); + setReferenceVarValue(currentVarValue); for (int i=0; i<newValuesLength; i++) { coefs[i] = newValues[i]; @@ -402,16 +405,16 @@ } template <typename T> -void tPolynomial<T>::setRates(tArray<REAL> newValues, REAL valueOfVariable) +void tPolynomial<T>::setRates(tArray<REAL> newValues, REAL currentVarValue) { coefs = newValues; - setBaseValueOfVariable(valueOfVariable); + setReferenceVarValue(currentVarValue); } template <typename T> -REAL tPolynomial<T>::evaluate( REAL valueOfVariable ) const +REAL tPolynomial<T>::evaluate( REAL currentVarValue ) const { - REAL deltaVariableValue = (valueOfVariable - baseValueOfVariable); + REAL deltaVariableValue = (currentVarValue - referenceVarValue); REAL res = 0.0; @@ -429,7 +432,7 @@ template <typename T> T & tPolynomial<T>::WriteSync( T & m ) const { - m << baseValueOfVariable; + m << referenceVarValue; // write length m << coefs.Len(); @@ -444,7 +447,7 @@ template <typename T> T & tPolynomial<T>::ReadSync( T & m ) { - m >> baseValueOfVariable; + m >> referenceVarValue; // Read the length int newLength = 0; @@ -472,6 +475,7 @@ template <typename T> tPolynomial<T> const tPolynomial<T>::operator*( const tPolynomial<T> & tfRight ) const { tPolynomial<T> tf; + tf.setAtSameReferenceVarValue(tfRight); // If any Polygonial is of size 0, then the resulting one is too // Otherwise, it is the sum of both lenght, minus 1. @@ -509,7 +513,7 @@ template <typename T> tPolynomial<T> const tPolynomial<T>::operator+( const tPolynomial<T> &tfRight ) const { // Bring the polynomial to the same baseValue, so that the terms mean the same thing - tPolynomial<T> tRebasedRight(tfRight.evaluateCoefsAt(this->baseValueOfVariable)); + tPolynomial<T> tRebasedRight(tfRight.adaptToNewReferenceVarValue(this->referenceVarValue)); int maxLength = MAX(this->coefs.Len(), tfRight.coefs.Len()); @@ -526,7 +530,7 @@ template <typename T> tPolynomial<T> & tPolynomial<T>::operator+=( const tPolynomial<T> &tfRight ) { // Bring the polynomial to the same baseValue, so that the terms mean the same thing - tPolynomial<T> tRebasedRight = tfRight.evaluateCoefsAt(this->baseValueOfVariable); + tPolynomial<T> tRebasedRight = tfRight.adaptToNewReferenceVarValue(this->referenceVarValue); int maxLength = MAX(this->coefs.Len(), tfRight.coefs.Len()); // Set the lenght to the longest member of the addition @@ -564,29 +568,32 @@ void tPolynomial<T>::operator=(tPolynomial<T> const &other) { coefs = other.coefs; - baseValueOfVariable = other.baseValueOfVariable; + referenceVarValue = other.referenceVarValue; } template <typename T> -void tPolynomial<T>::toString() const { - std::cout << "base :" << baseValueOfVariable << " lenght:" << coefs.Len(); +std::string tPolynomial<T>::toString() const { + std::ostringstream ostr(""); + ostr << "base :" << referenceVarValue << " lenght:" << coefs.Len(); + for (int i=0; i<coefs.Len(); i++) { - std::cout << " c[" << i << "]:" << coefs[i]; + ostr << " c[" << i << "]:" << coefs[i]; } - std::cout << std::endl; + return ostr.str(); } + /** * If the current polynomial is within the range, return a copy of itself * Otherwise, return a new polynomial that is bound by the range */ template <typename T> -tPolynomial<T> const tPolynomial<T>::clamp(REAL minValue, REAL maxValue, REAL valueOfVariable) +tPolynomial<T> const tPolynomial<T>::clamp(REAL minValue, REAL maxValue, REAL currentVarValue) { tPolynomial<T> tf(*this); - REAL valueAt = evaluate(valueOfVariable); + REAL valueAt = evaluate(currentVarValue); if (valueAt < minValue) { tf[0] = minValue; for (int i=1; i<coefs.Len(); i++) { @@ -607,6 +614,16 @@ return tf; } +/** + * Will change our referenceVarValue to that of the designated object. + */ +template <typename T> +void tPolynomial<T>::setAtSameReferenceVarValue(tPolynomial<T> const &other) +{ + REAL a = other.referenceVarValue; + referenceVarValue = a; + // referenceVarValue = other.referenceVarValue; +} // ******************************************************* // ******************************************************* @@ -627,6 +644,9 @@ tPolynomial<D> tf(0); tPolynomial<D> res(0); + tf.setAtSameReferenceVarValue(other); + res.setAtSameReferenceVarValue(other); + for(int i=variants.Len()-1; i>0; i--) { tf = (tf + variants[i]) * other; } @@ -637,12 +657,14 @@ { REAL tData[] = {0.0, 1.0}; tPolynomial<D> t(tData, sizeof(tData)/sizeof(tData[0])); + t.setAtSameReferenceVarValue(other); res = tf * t; } // Reset tf for further computation tf = tPolynomial<D>(0); + tf.setAtSameReferenceVarValue(other); for(int i=constants.Len()-1; i>0; i--) { tf = (tf + constants[i]) * other; @@ -653,7 +675,6 @@ res += tf; - return res; } Modified: armagetronad/trunk/armagetronad/src/tools/unitTest/tPolynomialMarshalerTest.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tools/unitTest/tPolynomialMarshalerTest.cpp 2008-02-17 17:22:53 UTC (rev 7985) +++ armagetronad/trunk/armagetronad/src/tools/unitTest/tPolynomialMarshalerTest.cpp 2008-02-17 17:54:01 UTC (rev 7986) @@ -18,6 +18,7 @@ CPPUNIT_TEST( testParsing ); CPPUNIT_TEST( testConstructor ); CPPUNIT_TEST( testMarshaling ); + CPPUNIT_TEST( testMarshalingWithBase ); CPPUNIT_TEST_SUITE_END(); public: @@ -149,9 +150,9 @@ std::cout << std::endl; std::cout << "manually generated expected output for case B : " << std::endl; - out2.toString(); + std::cout << out2.toString() << std::endl; std::cout << "marshaled output for case B : " << std::endl; - marshalerB.marshal(inputPolynomial).toString(); + std::cout << marshalerB.marshal(inputPolynomial).toString() << std::endl; */ /* @@ -169,9 +170,9 @@ std::cout << std::endl; std::cout << "manually generated expected output for case C : " << std::endl; - out3.toString(); + std::cout << out3.toString() << std::endl; std::cout << "marshaled output for case C : " << std::endl; - marshalerC.marshal(inputPolynomial).toString(); + std::cout << marshalerC.marshal(inputPolynomial).toString() << std::endl; */ CPPUNIT_ASSERT ( expectedA == marshalerA.marshal(inputPolynomial) ); @@ -179,6 +180,25 @@ CPPUNIT_ASSERT ( expectedC == marshalerC.marshal(inputPolynomial) ); } + /** + * The same logical input, transformed to 2 different reference value, and then marshalled + * should produce the same value at a given current value. + */ + void testMarshalingWithBase() + { + float inputData[] = {7, 5, 3}; + tPolynomial<nMessageMock> inputPolynomialAt0(inputData, sizeof(inputData)/sizeof(inputData[0])); + tPolynomial<nMessageMock> inputPolynomialAt3(inputPolynomialAt0.adaptToNewReferenceVarValue(3)); + + tPolynomial<nMessageMock> marshaledResultAt0 = marshalerB.marshal(inputPolynomialAt0); + tPolynomial<nMessageMock> marshaledResultAt3 = marshalerB.marshal(inputPolynomialAt3); + + // CPPUNIT_ASSERT ( marshaledResultAt0 == marshaledResultAt3 ); + std::cout << "at 0 : " << marshaledResultAt0(5) << " at 3 " << marshaledResultAt3(5) << std::endl; + CPPUNIT_ASSERT ( marshaledResultAt0(5) == marshaledResultAt3(5) ); + + } + }; CPPUNIT_TEST_SUITE_REGISTRATION( tPolynomialMarshalerTest ); Modified: armagetronad/trunk/armagetronad/src/tools/unitTest/tPolynomialTest.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tools/unitTest/tPolynomialTest.cpp 2008-02-17 17:22:53 UTC (rev 7985) +++ armagetronad/trunk/armagetronad/src/tools/unitTest/tPolynomialTest.cpp 2008-02-17 17:54:01 UTC (rev 7986) @@ -92,20 +92,20 @@ CPPUNIT_ASSERT( (tpA + 1.0) == (tpB + 2.0) + tpC + -1.0); - tPolynomial<nMessageMock> tpAat5 = tpA.evaluateCoefsAt(5.0); - tPolynomial<nMessageMock> tpBat5 = tpB.evaluateCoefsAt(5.0); - tPolynomial<nMessageMock> tpCat5 = tpC.evaluateCoefsAt(5.0); + tPolynomial<nMessageMock> tpAat5 = tpA.adaptToNewReferenceVarValue(5.0); + tPolynomial<nMessageMock> tpBat5 = tpB.adaptToNewReferenceVarValue(5.0); + tPolynomial<nMessageMock> tpCat5 = tpC.adaptToNewReferenceVarValue(5.0); CPPUNIT_ASSERT( tpAat5 == tpBat5 + tpCat5 ); // - // Adding 2 polynomial having different baseValueOfVariable + // Adding 2 polynomial having different referenceVarValue // - tPolynomial<nMessageMock> tpAat3 = tpA.evaluateCoefsAt(3.0); - tPolynomial<nMessageMock> tpCat7 = tpC.evaluateCoefsAt(7.0); + tPolynomial<nMessageMock> tpAat3 = tpA.adaptToNewReferenceVarValue(3.0); + tPolynomial<nMessageMock> tpCat7 = tpC.adaptToNewReferenceVarValue(7.0); // Addition - tPolynomial<nMessageMock> tpAat3at5 = tpAat3.evaluateCoefsAt(5.0); - tPolynomial<nMessageMock> tpCat7at5 = tpCat7.evaluateCoefsAt(5.0); + tPolynomial<nMessageMock> tpAat3at5 = tpAat3.adaptToNewReferenceVarValue(5.0); + tPolynomial<nMessageMock> tpCat7at5 = tpCat7.adaptToNewReferenceVarValue(5.0); tPolynomial<nMessageMock> sum = (tpBat5 + tpCat7); CPPUNIT_ASSERT( tpAat3 == tpBat5 + tpCat7 ); @@ -207,8 +207,8 @@ // change the base argument and adjust the coefs to time 5 float NEW_REFERENCE_TIME = 5.0; - tfA = tfA.evaluateCoefsAt(NEW_REFERENCE_TIME); - tfB = tfB.evaluateCoefsAt(NEW_REFERENCE_TIME); + tfA = tfA.adaptToNewReferenceVarValue(NEW_REFERENCE_TIME); + tfB = tfB.adaptToNewReferenceVarValue(NEW_REFERENCE_TIME); // These should still be true CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.0, tfA.evaluate(0), DELTA); Modified: armagetronad/trunk/armagetronad/src/tron/gParser.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gParser.cpp 2008-02-17 17:22:53 UTC (rev 7985) +++ armagetronad/trunk/armagetronad/src/tron/gParser.cpp 2008-02-17 17:54:01 UTC (rev 7986) @@ -833,6 +833,13 @@ else if (isElement(cur->name, (const xmlChar *)"Rotation", keyword)) { zZoneInfluenceItemRotation *b = new zZoneInfluenceItemRotation(refZone); + tPolynomialMarshaler tpm; + + string str = string(myxmlGetProp(cur, "rotation")); + tpm.parse(str); + b->set(tpm); + + /* string str = string(myxmlGetProp(cur, "rotationAngle")); tFunction tfRotationAngle; myCheapParameterSplitter(str, tfRotationAngle, false); @@ -842,6 +849,7 @@ myCheapParameterSplitter(str, tfRotationSpeed, false); b->set(tfRotationAngle, tfRotationSpeed); + */ infl->addZoneInfluenceRule(zZoneInfluenceItemPtr(b)); } else if (isElement(cur->name, (const xmlChar *)"Scale", keyword)) { @@ -901,6 +909,15 @@ zMonitorInfluencePtr infl = zMonitorInfluencePtr(new zMonitorInfluence(ref)); infl->setMarked(myxmlGetPropTriad(cur, "marked")); + + if (xmlHasProp(cur, (const xmlChar*)"influence")) { + string str = string(myxmlGetProp(cur, "influence")); + tPolynomialMarshaler tpmInfluence; + tpmInfluence.parse(str); + + infl->setInfluence( tpmInfluence ); + } + if (xmlHasProp(cur, (const xmlChar*)"influenceSlide")) { string str = string(myxmlGetProp(cur, "influenceSlide")); tPolynomial<nMessage> tpInfluenceSlide(2); @@ -1339,8 +1356,15 @@ zValidatorPtr validator = zValidatorPtr( new zValidatorAll(_ignore, _ignore) ); zZoneInfluenceItemRotation *b = new zZoneInfluenceItemRotation(zone); - b->set( tFunction(0.0f, 0.0f), tFunction(0.3f, 2.0f * 3.141f / 11.0f) ); + tPolynomialMarshaler tpm; + + string str = string(myxmlGetProp(cur, "rotation")); + tpm.parse(str); + b->set(tpm); + + // b->set( tFunction(0.0f, 0.0f), tFunction(0.3f, 2.0f * 3.141f / 11.0f) ); + zZoneInfluencePtr infl = zZoneInfluencePtr(new zZoneInfluence(zone)); infl->addZoneInfluenceRule(zZoneInfluenceItemPtr(b)); Modified: armagetronad/trunk/armagetronad/src/tron/zone/zEffectGroup.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/zone/zEffectGroup.cpp 2008-02-17 17:22:53 UTC (rev 7985) +++ armagetronad/trunk/armagetronad/src/tron/zone/zEffectGroup.cpp 2008-02-17 17:54:01 UTC (rev 7986) @@ -20,7 +20,7 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - + *************************************************************************** */ @@ -50,7 +50,7 @@ void zEffectGroup::operator=(zEffectGroup const &other) { - if(this != &other) { + if (this != &other) { validators = other.validators; d_owners = other.d_owners; d_teamOwners = other.d_teamOwners; @@ -58,13 +58,13 @@ } } -void zEffectGroup::apply( Triggerer possibleUser, REAL &time, miscDataPtr miscData ) +void zEffectGroup::apply( Triggerer possibleUser, REAL &time, const tPolynomial<nMessage> & tp ) { std::vector<zValidatorPtr>::const_iterator iter; - for(iter=validators.begin(); + for (iter=validators.begin(); iter!=validators.end(); ++iter) { - (*iter)->validate(d_owners, d_teamOwners, possibleUser, miscData); + (*iter)->validate(d_owners, d_teamOwners, possibleUser, tp); } } Modified: armagetronad/trunk/armagetronad/src/tron/zone/zEffectGroup.h =================================================================== --- armagetronad/trunk/armagetronad/src/tron/zone/zEffectGroup.h 2008-02-17 17:22:53 UTC (rev 7985) +++ armagetronad/trunk/armagetronad/src/tron/zone/zEffectGroup.h 2008-02-17 17:54:01 UTC (rev 7986) @@ -20,7 +20,7 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - + *************************************************************************** */ @@ -32,6 +32,7 @@ #include "gCycle.h" #include <boost/shared_ptr.hpp> #include "zone/zMisc.h" +#include "tPolynomial.h" class zValidator; typedef boost::shared_ptr<zValidator> zValidatorPtr; @@ -46,12 +47,14 @@ ~zEffectGroup(); void operator=(zEffectGroup const &other); - void addValidator(zValidatorPtr _validator) {validators.push_back( _validator );}; + void addValidator(zValidatorPtr _validator) { + validators.push_back( _validator ); + }; bool isValidUser(gCycle *possibleUser); gVectorExtra <ePlayerNetID *> getCalculatedTarget( gCycle * triggerer ); - void apply( Triggerer target, REAL &time, miscDataPtr miscData = miscDataPtr() ); //!< reacts on objects interacting with the zone + void apply( Triggerer target, REAL &time, const tPolynomial<nMessage> & tp ); //!< reacts on objects interacting with the zone //callback functions gCycle * cb_PossibleUser(void); //!< Gets the used rubber for the currently watched cycle Modified: armagetronad/trunk/armagetronad/src/tron/zone/zMonitor.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/zone/zMonitor.cpp 2008-02-17 17:22:53 UTC (rev 7985) +++ armagetronad/trunk/armagetronad/src/tron/zone/zMonitor.cpp 2008-02-17 17:54:01 UTC (rev 7986) @@ -145,7 +145,6 @@ void zMonitorRule::applyRule(triggerers &contributors, REAL time, const tPolynomial<nMessage> &valueEq) { /* We take all the contributors */ /* And apply the proper effect */ - miscDataPtr value = miscDataPtr(new REAL(valueEq.evaluate(time))); // Go through all effectgroups (owners of some action) std::vector<zEffectGroupPtr>::iterator iter; @@ -159,7 +158,7 @@ iter2 != contributors.end(); ++iter2) { - (*iter)->apply(*iter2, time, value); + (*iter)->apply(*iter2, time, valueEq); } } @@ -218,10 +217,13 @@ } void -zMonitorInfluence::apply(gVectorExtra< nNetObjectID > &owners, gVectorExtra< nNetObjectID > &teamOwners, gCycle * user, tPolynomial<nMessage> valueEq) { +zMonitorInfluence::apply(gVectorExtra< nNetObjectID > &owners, gVectorExtra< nNetObjectID > &teamOwners, gCycle * user, const tPolynomial<nMessage> &valueEq) { // Currently, we discard ownership information - if (influenceSlideAvailable == true) - monitor->affectSlide(user, influenceSlide, marked); + + tPolynomial<nMessage> tf = influence.marshal(valueEq); + monitor->affectSlide(user, tf, marked); + + // TODO: // if (influenceAddAvailable == true) // monitor->affectAdd(user, influenceAdd(value), marked); Modified: armagetronad/trunk/armagetronad/src/tron/zone/zMonitor.h =================================================================== --- armagetronad/trunk/armagetronad/src/tron/zone/zMonitor.h 2008-02-17 17:22:53 UTC (rev 7985) +++ armagetronad/trunk/armagetronad/src/tron/zone/zMonitor.h 2008-02-17 17:54:01 UTC (rev 7986) @@ -184,6 +184,7 @@ */ class zMonitorInfluence { zMonitorPtr monitor; + tPolynomialMarshaler influence; tPolynomial<nMessage> influenceSlide; tFunction influenceAdd; tFunction influenceSet; @@ -197,6 +198,7 @@ public: zMonitorInfluence(zMonitorPtr aMonitor): monitor(aMonitor), + influence(), influenceSlide(), influenceAdd(), influenceSet(), @@ -207,11 +209,15 @@ { }; ~zMonitorInfluence() { }; - void apply(gVectorExtra< nNetObjectID > &owners, gVectorExtra< nNetObjectID > &teamOwners, gCycle* triggerer, tPolynomial<nMessage> valueEq); + void apply(gVectorExtra< nNetObjectID > &owners, gVectorExtra< nNetObjectID > &teamOwners, gCycle* triggerer, const tPolynomial<nMessage> &valueEq); void setMarked(Triad mark) { marked = mark; }; + void setInfluence(tPolynomialMarshaler infl) { + influence = infl; + } + void setInfluenceSlide(tPolynomial<nMessage> infl) { influenceSlide = infl; influenceSlideAvailable=true; Modified: armagetronad/trunk/armagetronad/src/tron/zone/zValidator.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/zone/zValidator.cpp 2008-02-17 17:22:53 UTC (rev 7985) +++ armagetronad/trunk/armagetronad/src/tron/zone/zValidator.cpp 2008-02-17 17:54:01 UTC (rev 7986) @@ -20,7 +20,7 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - + *************************************************************************** */ @@ -49,7 +49,7 @@ void zValidator::operator=(zValidator const &other) { - if(this != &other) { + if (this != &other) { positive = other.getPositive(); marked = other.getMarked(); } @@ -63,7 +63,7 @@ zValidator::isOwner(ePlayerNetID *possibleOwner, gVectorExtra< nNetObjectID > &owners) { gVectorExtra< nNetObjectID >::iterator iter; - for(iter = owners.begin(); + for (iter = owners.begin(); iter != owners.end(); ++iter) { @@ -77,7 +77,7 @@ zValidator::isTeamOwner(eTeam *possibleTeamOwner, gVectorExtra< nNetObjectID > &teamOwners) { gVectorExtra< nNetObjectID >::iterator iter; - for(iter = teamOwners.begin(); + for (iter = teamOwners.begin(); iter != teamOwners.end(); ++iter) { @@ -90,14 +90,11 @@ } void -zValidator::validate(gVectorExtra< nNetObjectID > &owners, gVectorExtra< nNetObjectID > &teamOwners, Triggerer possibleUser, miscDataPtr &miscData) { - REAL value = 0.0; - if ( miscData.get() != 0 ) - value = *miscData; +zValidator::validate(gVectorExtra< nNetObjectID > &owners, gVectorExtra< nNetObjectID > &teamOwners, Triggerer possibleUser, const tPolynomial<nMessage> &tpValue) { - if(isValid(owners, teamOwners, possibleUser.who) && validateTriad(possibleUser.positive, positive) && validateTriad(possibleUser.marked, marked)) { + if (isValid(owners, teamOwners, possibleUser.who) && validateTriad(possibleUser.positive, positive) && validateTriad(possibleUser.marked, marked)) { zSelectorPtrs::const_iterator iterSelector; - for(iterSelector=selectors.begin(); + for (iterSelector=selectors.begin(); iterSelector!=selectors.end(); ++iterSelector) { @@ -105,20 +102,20 @@ } zMonitorInfluencePtrs::const_iterator iterMonitorInfluence; - for(iterMonitorInfluence=monitorInfluences.begin(); + for (iterMonitorInfluence=monitorInfluences.begin(); iterMonitorInfluence!=monitorInfluences.end(); ++iterMonitorInfluence) { - (*iterMonitorInfluence)->apply(owners, teamOwners, possibleUser.who, value); + (*iterMonitorInfluence)->apply(owners, teamOwners, possibleUser.who, tpValue); } zZoneInfluencePtrs::const_iterator iterZoneInfluence; - for(iterZoneInfluence=zoneInfluences.begin(); + for (iterZoneInfluence=zoneInfluences.begin(); iterZoneInfluence!=zoneInfluences.end(); ++iterZoneInfluence) { - // TODO: - (*iterZoneInfluence)->apply(tPolynomial<nMessage>(value) ); + // TODO: + (*iterZoneInfluence)->apply( tpValue ); } } } @@ -283,37 +280,37 @@ { switch(d_userType) { - case UserAll: + case UserAll: // Everybody, irrevelantly of any settings, is allowed to // trigger this Zone. This will be the default behavior. return true; break; - case UserOwner: + case UserOwner: // Only a player that has its id in the owner field of the // Zone can trigger it (revisit this when a decision is made about // multiple owners) return isOwner(possibleUser->Player()); break; - case UserOwnerTeam: + case UserOwnerTeam: // Only a player member of a team that has its id in the // ownerTeam field can trigger this Zone. Thus the Zone can be // triggered by any of the members of a team. return isTeamOwner(possibleUser->Player()->CurrentTeam()); break; - case UserAllButOwner: + case UserAllButOwner: // Only the player that has its id in the owner field is // denied triggering the Zone. This is the opposite effect as // Owner. It is synonymous to "everybody but the owner of the Zone". return !isOwner(possibleUser->Player()); break; - case UserAllButTeamOwner: + case UserAllButTeamOwner: // Only players that are members of the team that // has its id in the ownerTeam field are denied triggering this // Zone. This is the opposite of OwnerTeam. It is synonymous to // "everybody but the team owner of the Zone". return !isTeamOwner(possibleUser->Player()->CurrentTeam()); break; - case UserAnotherTeammate: + case UserAnotherTeammate: // This Zone is restricted to players that are // member of the same team as the player which id is stored in the // owner field. The triggering of the Zone is itself denied to the Modified: armagetronad/trunk/armagetronad/src/tron/zone/zValidator.h =================================================================== --- armagetronad/trunk/armagetronad/src/tron/zone/zValidator.h 2008-02-17 17:22:53 UTC (rev 7985) +++ armagetronad/trunk/armagetronad/src/tron/zone/zValidator.h 2008-02-17 17:54:01 UTC (rev 7986) @@ -20,7 +20,7 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - + *************************************************************************** */ @@ -37,8 +37,8 @@ #include "eTeam.h" #include "zone/zMisc.h" #include <boost/shared_ptr.hpp> +#include "tPolynomial.h" - class zSelector; typedef boost::shared_ptr<zSelector> zSelectorPtr; typedef std::vector< zSelectorPtr > zSelectorPtrs; @@ -61,14 +61,24 @@ virtual zValidator *copy(void) const; virtual ~zValidator() {}; - void validate(gVectorExtra< nNetObjectID > &owners, gVectorExtra< nNetObjectID > &teamOwners, Triggerer possibleUser, miscDataPtr &miscData); + void validate(gVectorExtra< nNetObjectID > &owners, gVectorExtra< nNetObjectID > &teamOwners, Triggerer possibleUser, const tPolynomial<nMessage> &tp); - void addSelector(zSelectorPtr _selector) {selectors.push_back(_selector);}; - void addMonitorInfluence(zMonitorInfluencePtr newInfluence) {monitorInfluences.push_back( newInfluence );}; - void addZoneInfluence(zZoneInfluencePtr newInfluence) {zoneInfluences.push_back( newInfluence );}; + void addSelector(zSelectorPtr _selector) { + selectors.push_back(_selector); + }; + void addMonitorInfluence(zMonitorInfluencePtr newInfluence) { + monitorInfluences.push_back( newInfluence ); + }; + void addZoneInfluence(zZoneInfluencePtr newInfluence) { + zoneInfluences.push_back( newInfluence ); + }; - Triad getPositive(void) const {return positive;}; - Triad getMarked(void) const {return marked;}; + Triad getPositive(void) const { + return positive; + }; + Triad getMarked(void) const { + return marked; + }; protected: zSelectorPtrs selectors; @@ -81,7 +91,9 @@ bool isOwner(ePlayerNetID *possibleOwner, gVectorExtra< nNetObjectID > &owners); bool isTeamOwner(eTeam *possibleTeamOwner, gVectorExtra< nNetObjectID > &teamOwners); - virtual bool isValid(gVectorExtra< nNetObjectID > &owners, gVectorExtra< nNetObjectID > &teamOwners, gCycle* possibleUser) {return false;}; + virtual bool isValid(gVectorExtra< nNetObjectID > &owners, gVectorExtra< nNetObjectID > &teamOwners, gCycle* possibleUser) { + return false; + }; }; @@ -95,7 +107,9 @@ virtual ~zValidatorAll() {}; zValidator *copy(void) const; protected: - bool isValid(gVectorExtra< nNetObjectID > &owners, gVectorExtra< nNetObjectID > &teamOwners, gCycle* possibleUser) { return true ;}; + bool isValid(gVectorExtra< nNetObjectID > &owners, gVectorExtra< nNetObjectID > &teamOwners, gCycle* possibleUser) { + return true ; + }; }; class zValidatorOwner : public zValidator @@ -156,7 +170,7 @@ * ******** WARNING ********* * This include has to be at the end of this file to break a cyclic referencing. * The classes involved are, in order: - * + * * zMonitorRule * zEffectGroup * zValidator Modified: armagetronad/trunk/armagetronad/src/tron/zone/zZone.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/zone/zZone.cpp 2008-02-17 17:22:53 UTC (rev 7985) +++ armagetronad/trunk/armagetronad/src/tron/zone/zZone.cpp 2008-02-17 17:54:01 UTC (rev 7986) @@ -40,6 +40,7 @@ #include "tString.h" #include "rScreen.h" #include "eSoundMixer.h" +#include "tPolynomial.h" #include <time.h> @@ -549,6 +550,8 @@ } } +REAL asdf[] = {0, 1}; +tPolynomial<nMessage> tpOne(asdf, sizeof(asdf)/sizeof(asdf[0])); // ******************************************************************************* // * // * OnEnter @@ -571,7 +574,7 @@ iter != effectGroupEnter.end(); ++iter) { - (*iter)->apply(triggerer, time, miscDataPtr()); + (*iter)->apply(triggerer, time, tpOne); } } @@ -587,7 +590,7 @@ iter != effectGroupInside.end(); ++iter) { - (*iter)->apply(triggerer, time); + (*iter)->apply(triggerer, time, tpOne); } } void zZone::OnLeave( gCycle * target, REAL time ) @@ -602,7 +605,7 @@ iter != effectGroupLeave.end(); ++iter) { - (*iter)->apply(triggerer, time); + (*iter)->apply(triggerer, time, tpOne); } } void zZone::OnOutside( gCycle * target, REAL time ) @@ -617,7 +620,7 @@ iter != effectGroupOutside.end(); ++iter) { - (*iter)->apply(triggerer, time); + (*iter)->apply(triggerer, time, tpOne); } } Modified: armagetronad/trunk/armagetronad/src/tron/zone/zZoneInfluence.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/zone/zZoneInfluence.cpp 2008-02-17 17:22:53 UTC (rev 7985) +++ armagetronad/trunk/armagetronad/src/tron/zone/zZoneInfluence.cpp 2008-02-17 17:54:01 UTC (rev 7986) @@ -25,29 +25,14 @@ zZoneInfluenceItemRotation::zZoneInfluenceItemRotation(zZonePtr aZone): zZoneInfluenceItem(aZone), - rotationAngle(), - rotationSpeed() + rotation() {} void zZoneInfluenceItemRotation::apply(const tPolynomial<nMessage> &valueEq) { - // x is the influence from the monitor value - // t is the influence from the current time - // tf = (a +b*x) + (c + d*x)*t - // The following should improve readability - REAL tData[] = {0.0, 1.0}; - tPolynomial<nMessage> t(tData, sizeof(tData)/sizeof(tData[0])); - - REAL a = rotationAngle.GetOffset(); - REAL b = rotationAngle.GetSlope(); - REAL c = rotationSpeed.GetOffset(); - REAL d = rotationSpeed.GetSlope(); - - tPolynomial<nMessage> tf = - ( (valueEq * b) + a) - + t * ( (valueEq * d) + c); - + tPolynomial<nMessage> tf = rotation.marshal(valueEq); + zone->getShape()->setRotation2( tf ); } Modified: armagetronad/trunk/armagetronad/src/tron/zone/zZoneInfluence.h =================================================================== --- armagetronad/trunk/armagetronad/src/tron/zone/zZoneInfluence.h 2008-02-17 17:22:53 UTC (rev 7985) +++ armagetronad/trunk/armagetronad/src/tron/zone/zZoneInfluence.h 2008-02-17 17:54:01 UTC (rev 7986) @@ -29,7 +29,9 @@ ~zZoneInfluence(); void apply(const tPolynomial<nMessage> &value); - void addZoneInfluenceRule(zZoneInfluenceItemPtr aRule) {zoneInfluenceItems.push_back(aRule);}; + void addZoneInfluenceRule(zZoneInfluenceItemPtr aRule) { + zoneInfluenceItems.push_back(aRule); + }; }; class zZoneInfluenceItem { @@ -44,16 +46,16 @@ class zZoneInfluenceItemRotation : public zZoneInfluenceItem { protected: - tFunction rotationAngle; // The base component of the rotation speed - tFunction rotationSpeed; + tPolynomialMarshaler rotation; public: zZoneInfluenceItemRotation(zZonePtr aZone); virtual ~zZoneInfluenceItemRotation() {}; - void set(tFunction rotAngle, tFunction rotSpeed) { - rotationAngle = rotAngle; - rotationSpeed = rotSpeed; - }; + void set(const tPolynomialMarshaler & other) + { + rotation = other; + } + virtual void apply(const tPolynomial<nMessage> &value); }; @@ -64,7 +66,9 @@ zZoneInfluenceItemScale(zZonePtr aZone); virtual ~zZoneInfluenceItemScale() {}; - void set(REAL sca) { scale = sca; }; + void set(REAL sca) { + scale = sca; + }; virtual void apply(const tPolynomial<nMessage> &value); }; @@ -75,7 +79,9 @@ zZoneInfluenceItemPosition(zZonePtr aZone); virtual ~zZoneInfluenceItemPosition() {}; - void set(eCoord const & p) {pos = p;}; + void set(eCoord const & p) { + pos = p; + }; virtual void apply(const tPolynomial<nMessage> &value); }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wrt...@us...> - 2008-02-18 22:47:42
|
Revision: 7996 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7996&view=rev Author: wrtlprnft Date: 2008-02-18 14:47:47 -0800 (Mon, 18 Feb 2008) Log Message: ----------- more realistic calculation of stereo images. the old stuff wasn't really correct, it just sort of worked. Modified Paths: -------------- armagetronad/trunk/armagetronad/config/settings.cfg armagetronad/trunk/armagetronad/src/engine/eCamera.cpp armagetronad/trunk/armagetronad/src/render/rGradient.cpp armagetronad/trunk/armagetronad/src/render/rViewport.cpp armagetronad/trunk/armagetronad/src/render/rViewport.h Modified: armagetronad/trunk/armagetronad/config/settings.cfg =================================================================== --- armagetronad/trunk/armagetronad/config/settings.cfg 2008-02-18 11:42:01 UTC (rev 7995) +++ armagetronad/trunk/armagetronad/config/settings.cfg 2008-02-18 22:47:47 UTC (rev 7996) @@ -660,11 +660,11 @@ # red/green 3D rendering settings # you need red/green or red/cyan 3D glasses to see anything meaningful if you use these -CAMERA_EYE_DISTANCE 0 # The distance between the two eyes of the camera. Meaninful values lie between 0.1 and 0.5 -CAMERA_EYE_1_COLOR 1 # The color mask of the first eye of the camera. 1 is red, 2 is green, 4 is blue, any sum of these values means more than one color -CAMERA_EYE_1_COLOR 6 # The color mask of the second eye of the camera +#CAMERA_EYE_DISTANCE 0 # The distance between the two eyes of the camera. Meaninful values lie between 0.1 and 0.5 +#CAMERA_EYE_1_COLOR 1 # The color mask of the first eye of the camera. 1 is red, 2 is green, 4 is blue, any sum of these values means more than one color +#CAMERA_EYE_1_COLOR 6 # The color mask of the second eye of the camera #CAMERA_EYE_1_COLOR 2 # for red/green glasses -CAMERA_IN_MAX_FOCUS_DISTANCE .5 # This, multiplied by the current speed, determines the maximum distance of the focus of the two eyes unless a wall is closer +#CAMERA_IN_MAX_FOCUS_DISTANCE .5 # This, multiplied by the current speed, determines the maximum distance of the focus of the two eyes unless a wall is closer # server browser query settings Modified: armagetronad/trunk/armagetronad/src/engine/eCamera.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/engine/eCamera.cpp 2008-02-18 11:42:01 UTC (rev 7995) +++ armagetronad/trunk/armagetronad/src/engine/eCamera.cpp 2008-02-18 22:47:47 UTC (rev 7996) @@ -1443,9 +1443,8 @@ glMatrixMode(GL_MODELVIEW); glLoadIdentity(); - if(CenterCockpitFixedBefore()){ - vp->Perspective(fov,zNear,1E+20); + vp->Perspective(fov,zNear,1E+20,se_cameraEyeDistance/2.); gluLookAt(0, 0, @@ -1491,7 +1490,7 @@ glMatrixMode(GL_MODELVIEW); glLoadIdentity(); - vp->Perspective(fov,zNear,1E+20); + vp->Perspective(fov,zNear,1E+20,-se_cameraEyeDistance/2.); float offset = 0; if(mode == CAMERA_IN) { @@ -1510,8 +1509,8 @@ 0, 0, - dir2.x, - dir2.y, + dir.x, + dir.y, rise, top.x,top.y, @@ -1519,7 +1518,7 @@ perp += pos; - glTranslatef(-perp.x,-perp.y,-z); + glTranslatef(-pos.x,-pos.y,-z); glMatrixMode(GL_MODELVIEW); draw_center=((CenterPos()-pos).NormSquared()>1 || Modified: armagetronad/trunk/armagetronad/src/render/rGradient.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/render/rGradient.cpp 2008-02-18 11:42:01 UTC (rev 7995) +++ armagetronad/trunk/armagetronad/src/render/rGradient.cpp 2008-02-18 22:47:47 UTC (rev 7996) @@ -187,7 +187,6 @@ #endif } -void se_glFloorTexture(); void rGradient::BeginDraw() { if(m_tex.Valid()) { m_tex.Select(); Modified: armagetronad/trunk/armagetronad/src/render/rViewport.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/render/rViewport.cpp 2008-02-18 11:42:01 UTC (rev 7995) +++ armagetronad/trunk/armagetronad/src/render/rViewport.cpp 2008-02-18 22:47:47 UTC (rev 7996) @@ -61,7 +61,7 @@ return 360*atan(tan(M_PI*fov/360)/ratio)/M_PI; } -void rViewport::Perspective(REAL fov,REAL nnear,REAL ffar){ +void rViewport::Perspective(REAL fov,REAL nnear,REAL ffar,REAL xshift){ #ifndef DEDICATED if (!sr_glOut) return; @@ -72,7 +72,9 @@ REAL xmul = ensureverticalfov * tan((M_PI / 360.0) * fov); REAL ymul = ensureverticalfov * aspectratio * xmul; glMatrixMode(GL_PROJECTION); - glFrustum(-nnear * xmul, nnear * xmul, -nnear * ymul, nnear * ymul, nnear, ffar); + xshift *= nnear; + glFrustum(-nnear * xmul + xshift, nnear * xmul + xshift, -nnear * ymul, nnear * ymul, nnear, ffar); + glTranslatef(xshift, 0.f, 0.f); #if 0 // Z-Man's old and clumsy version REAL ratio=currentScreensetting.aspect*(width*sr_screenWidth)/(height*sr_screenHeight); Modified: armagetronad/trunk/armagetronad/src/render/rViewport.h =================================================================== --- armagetronad/trunk/armagetronad/src/render/rViewport.h 2008-02-18 11:42:01 UTC (rev 7995) +++ armagetronad/trunk/armagetronad/src/render/rViewport.h 2008-02-18 22:47:47 UTC (rev 7996) @@ -52,7 +52,7 @@ void Select(); #endif - void Perspective(REAL fov,REAL zNear=1,REAL zFar=10000000); + void Perspective(REAL fov,REAL zNear=1,REAL zFar=10000000,REAL xShift = 0); REAL UpDownFOV(REAL fov); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wrt...@us...> - 2008-02-22 09:22:29
|
Revision: 8042 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=8042&view=rev Author: wrtlprnft Date: 2008-02-22 01:22:32 -0800 (Fri, 22 Feb 2008) Log Message: ----------- New setting to determine the color of the seperator line between the foregroud and background of bar gauges Modified Paths: -------------- armagetronad/trunk/armagetronad/resource/proto/Anonymous/original/original.cockpit.xml armagetronad/trunk/armagetronad/resource/proto/cockpit.dtd armagetronad/trunk/armagetronad/src/render/rGradient.cpp armagetronad/trunk/armagetronad/src/tron/cockpit/cGauges.cpp armagetronad/trunk/armagetronad/src/tron/cockpit/cGauges.h armagetronad/trunk/armagetronad/src/tron/cockpit/cWidgetBase.cpp armagetronad/trunk/armagetronad/src/tron/cockpit/cWidgetBase.h armagetronad/trunk/armagetronad/src/tron/zone/zShape.cpp Modified: armagetronad/trunk/armagetronad/resource/proto/Anonymous/original/original.cockpit.xml =================================================================== --- armagetronad/trunk/armagetronad/resource/proto/Anonymous/original/original.cockpit.xml 2008-02-22 00:03:58 UTC (rev 8041) +++ armagetronad/trunk/armagetronad/resource/proto/Anonymous/original/original.cockpit.xml 2008-02-22 09:22:32 UTC (rev 8042) @@ -72,6 +72,11 @@ <Color r="1." g="0." b="0." alpha=".9" at="1." /> </Gradient> </Foreground> + <LineColor> + <Solid> + <Color r="0" g="0" b="0" alpha="0" /> + </Solid> + </LineColor> </BarGauge> <BarGauge camera="^in"> <DataSet> @@ -105,6 +110,11 @@ <Color r="0." g="1." b="0." alpha=".9" at="1." /> </Gradient> </Foreground> + <LineColor> + <Solid> + <Color r="0" g="0" b="0" alpha="0" /> + </Solid> + </LineColor> </BarGauge> <!-- Example configuration for a Enemies: x Mates: y display --> @@ -338,6 +348,11 @@ <Color r="0." g="1." b="0." alpha="1." /> </Solid> </Foreground> + <LineColor> + <Solid> + <Color r="0" g="0" b="0" alpha="0" /> + </Solid> + </LineColor> </BarGauge> <Map camera="^in"> <Position x="0.73" y="-0.72" /> Modified: armagetronad/trunk/armagetronad/resource/proto/cockpit.dtd =================================================================== --- armagetronad/trunk/armagetronad/resource/proto/cockpit.dtd 2008-02-22 00:03:58 UTC (rev 8041) +++ armagetronad/trunk/armagetronad/resource/proto/cockpit.dtd 2008-02-22 09:22:32 UTC (rev 8042) @@ -32,6 +32,7 @@ Caption | Background | Foreground | + LineColor | MapModes )*)> <!ATTLIST WidgetTemplate %CommonWidgetAttributes;> @@ -46,7 +47,8 @@ Reverse | Caption | Background | - Foreground + Foreground | + LineColor )*)> <!ATTLIST BarGauge %CommonWidgetAttributes;> @@ -59,7 +61,8 @@ Reverse | Caption | Background | - Foreground + Foreground | + LineColor )*)> <!ATTLIST VerticalBarGauge %CommonWidgetAttributes;> @@ -168,6 +171,7 @@ <!ELEMENT Background (Image?,Solid?,Gradient?)> <!ELEMENT Foreground (Image?,Solid?,Gradient?)> +<!ELEMENT LineColor (Image?,Solid?,Gradient?)> <!-- Graphic is a regular graphic file, like something.png. ResourceGraphic is a resource xml file that contains more information on the image and may be a case of YouMightNeedThis --> Modified: armagetronad/trunk/armagetronad/src/render/rGradient.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/render/rGradient.cpp 2008-02-22 00:03:58 UTC (rev 8041) +++ armagetronad/trunk/armagetronad/src/render/rGradient.cpp 2008-02-22 09:22:32 UTC (rev 8042) @@ -145,7 +145,7 @@ #ifndef DEDICATED float tCoord::*x; //those are correct for horizontal gradients, float tCoord::*y; //vertical ones just get turned around - BeginDraw(); + BeginDraw(); BeginQuads(); switch(m_dir) { case horizontal: @@ -190,6 +190,8 @@ void rGradient::BeginDraw() { if(m_tex.Valid()) { m_tex.Select(); + } else { + glDisable(GL_TEXTURE_2D); } } Modified: armagetronad/trunk/armagetronad/src/tron/cockpit/cGauges.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/cockpit/cGauges.cpp 2008-02-22 00:03:58 UTC (rev 8041) +++ armagetronad/trunk/armagetronad/src/tron/cockpit/cGauges.cpp 2008-02-22 09:22:32 UTC (rev 8042) @@ -40,6 +40,7 @@ WithSingleData ::Process(cur) || WithBackground ::Process(cur) || WithForeground ::Process(cur) || + WithLineColor ::Process(cur) || WithCoordinates ::Process(cur) || WithCaption ::Process(cur) || WithShowSettings::Process(cur) || @@ -121,9 +122,11 @@ left.SetGradientEdges(edge1, edge2); right.SetGradientEdges(edge1, edge2); + m_line_color.SetGradientEdges(edge1, edge2); left.SetValue(y); right.SetValue(y); + m_line_color.SetValue(y); right.DrawRect( tCoord(m_size.x*x+m_position.x, m_position.y), @@ -133,10 +136,10 @@ tCoord(m_size.x*x+m_position.x, m_position.y), tCoord(m_position.x-m_size.x, m_position.y+m_size.y)); + m_line_color.BeginDraw(); BeginLines(); - Color(1.,1.,1.); - Vertex(m_size.x*x+m_position.x,m_position.y,0); - Vertex(m_size.x*x+m_position.x, m_size.y+m_position.y,0); + m_line_color.DrawPoint(tCoord(m_size.x*x+m_position.x,m_position.y)); + m_line_color.DrawPoint(tCoord(m_size.x*x+m_position.x,m_size.y+m_position.y)); RenderEnd(); //Value @@ -154,9 +157,11 @@ m_foreground.SetGradientEdges(edge1, edge2); m_background.SetGradientEdges(edge1, edge2); + m_line_color.SetGradientEdges(edge1, edge2); m_foreground.SetValue(y); m_background.SetValue(y); + m_line_color.SetValue(y); m_background.DrawRect( tCoord(m_position.x+m_size.x, m_position.y+m_size.y*x), @@ -166,10 +171,10 @@ tCoord(m_position.x+m_size.x, m_position.y-m_size.y), tCoord(m_position.x-m_size.x, m_position.y+m_size.y*x)); + m_line_color.BeginDraw(); BeginLines(); - Color(1.,1.,1.); - Vertex(m_position.x+m_size.x,m_position.y+m_size.y*x,0); - Vertex(m_position.x-m_size.x,m_position.y+m_size.y*x,0); + m_line_color.DrawPoint(tCoord(m_position.x+m_size.x,m_position.y+m_size.y*x)); + m_line_color.DrawPoint(tCoord(m_position.x-m_size.x,m_position.y+m_size.y*x)); RenderEnd(); //Value Modified: armagetronad/trunk/armagetronad/src/tron/cockpit/cGauges.h =================================================================== --- armagetronad/trunk/armagetronad/src/tron/cockpit/cGauges.h 2008-02-22 00:03:58 UTC (rev 8041) +++ armagetronad/trunk/armagetronad/src/tron/cockpit/cGauges.h 2008-02-22 09:22:32 UTC (rev 8042) @@ -40,7 +40,7 @@ namespace cWidget { //! Processes and renders a bar gauge -class BarGauge : public WithSingleData, public WithBackground, public WithForeground, public WithCoordinates, public WithShowSettings, public WithCaption, public WithReverse, public WithAngles { +class BarGauge : public WithSingleData, public WithBackground, public WithForeground, public WithLineColor, public WithCoordinates, public WithShowSettings, public WithCaption, public WithReverse, public WithAngles { public: virtual ~BarGauge() { }; //!< Do- nothing destructor void Render(); //!< Renders the gauge Modified: armagetronad/trunk/armagetronad/src/tron/cockpit/cWidgetBase.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/cockpit/cWidgetBase.cpp 2008-02-22 00:03:58 UTC (rev 8041) +++ armagetronad/trunk/armagetronad/src/tron/cockpit/cWidgetBase.cpp 2008-02-22 09:22:32 UTC (rev 8042) @@ -470,6 +470,14 @@ return WithColorFunctions::Process(cur); } +bool WithLineColor::Process(tXmlParser::node cur) { + if(cur.IsOfType("LineColor")) { + m_line_color = ProcessGradient(cur); + return true; + } + return WithColorFunctions::Process(cur); +} + bool WithCaption::Process(tXmlParser::node cur) { if(cur.IsOfType("Caption")) { ProcessCaption(cur); Modified: armagetronad/trunk/armagetronad/src/tron/cockpit/cWidgetBase.h =================================================================== --- armagetronad/trunk/armagetronad/src/tron/cockpit/cWidgetBase.h 2008-02-22 00:03:58 UTC (rev 8041) +++ armagetronad/trunk/armagetronad/src/tron/cockpit/cWidgetBase.h 2008-02-22 09:22:32 UTC (rev 8042) @@ -179,9 +179,17 @@ protected: rGradient m_background; //!< Stores the resulting background public: - bool Process(tXmlParser::node cur); //!< Calls WithColorFunctions::ProcessGradient() for Foreground nodes or passes on to WithColorFunctions::Process() + bool Process(tXmlParser::node cur); //!< Calls WithColorFunctions::ProcessGradient() for Background nodes or passes on to WithColorFunctions::Process() }; +//! Able to parse and store LineColor nodes +class WithLineColor : virtual public WithColorFunctions { +protected: + rGradient m_line_color; //!< Stores the resulting background +public: + bool Process(tXmlParser::node cur); //!< Calls WithColorFunctions::ProcessGradient() for LineColor nodes or passes on to WithColorFunctions::Process() +}; + //! Able to parse and store a Caption node class WithCaption : virtual public Base{ void ProcessCaption(tXmlParser::node cur); //!< Processes the inside of a Caption node Modified: armagetronad/trunk/armagetronad/src/tron/zone/zShape.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/zone/zShape.cpp 2008-02-22 00:03:58 UTC (rev 8041) +++ armagetronad/trunk/armagetronad/src/tron/zone/zShape.cpp 2008-02-22 09:22:32 UTC (rev 8042) @@ -263,7 +263,6 @@ glDisable(GL_LIGHT1); glDisable(GL_LIGHTING); glDisable(GL_CULL_FACE); - glDepthMask(GL_FALSE); glBlendFunc( GL_SRC_ALPHA, GL_ONE ); //glDisable(GL_TEXTURE); @@ -274,10 +273,13 @@ glMultMatrixf(&m[0][0]); // glScalef(.5,.5,.5); - if ( sr_alphaBlend ) + if ( sr_alphaBlend ) { + glDepthMask(GL_FALSE); BeginQuads(); - else + } else { + glDepthMask(GL_TRUE); BeginLineStrip(); + } const REAL seglen = .2f; const REAL bot = 0.0f; @@ -516,7 +518,6 @@ glDisable(GL_LIGHT1); glDisable(GL_LIGHTING); glDisable(GL_CULL_FACE); - glDepthMask(GL_FALSE); glBlendFunc( GL_SRC_ALPHA, GL_ONE ); //glDisable(GL_TEXTURE); @@ -534,10 +535,14 @@ glRotatef(rotation2.evaluate(lasttime_)*180/M_PI, 0.0, 0.0, 1.0); - if ( sr_alphaBlend ) + if ( sr_alphaBlend ) { + glDepthMask(GL_FALSE); BeginQuads(); - else + } else { + RenderEnd(); + glDepthMask(GL_TRUE); BeginLineStrip(); + } // const REAL seglen = .2f; const REAL bot = 0.0f; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <phi...@us...> - 2008-02-23 10:09:12
|
Revision: 8076 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=8076&view=rev Author: philippeqc Date: 2008-02-23 02:09:12 -0800 (Sat, 23 Feb 2008) Log Message: ----------- changed influenceSlide, influenceAdd and influenceSet to influence in the InfluenceMonitorchanged rotationSpeed and rotationAngle to rotation in the ZoneInfluenceItemRotation Modified Paths: -------------- armagetronad/trunk/armagetronad/resource/proto/map-0.3.1-c.dtd armagetronad/trunk/armagetronad/src/tron/gParser.cpp armagetronad/trunk/armagetronad/src/tron/zone/zMonitor.cpp armagetronad/trunk/armagetronad/src/tron/zone/zMonitor.h Modified: armagetronad/trunk/armagetronad/resource/proto/map-0.3.1-c.dtd =================================================================== --- armagetronad/trunk/armagetronad/resource/proto/map-0.3.1-c.dtd 2008-02-23 01:09:06 UTC (rev 8075) +++ armagetronad/trunk/armagetronad/resource/proto/map-0.3.1-c.dtd 2008-02-23 10:09:12 UTC (rev 8076) @@ -147,20 +147,13 @@ <!ATTLIST MonitorInfluence name CDATA #IMPLIED> <!ATTLIST MonitorInfluence marked (true | false | ignore) "ignore"> <!ATTLIST MonitorInfluence influence CDATA #IMPLIED> -<!ATTLIST MonitorInfluence influenceSlide CDATA #IMPLIED> -<!ATTLIST MonitorInfluence influenceAdd CDATA #IMPLIED> -<!ATTLIST MonitorInfluence influenceSet CDATA #IMPLIED> - <!ELEMENT ZoneInfluence (Rotation | Scale | Point | Color)+ > <!ATTLIST ZoneInfluence name CDATA #IMPLIED> <!ELEMENT Rotation EMPTY> -<!ATTLIST Rotation rotationAngle CDATA "0.0"> -<!ATTLIST Rotation rotationSpeed CDATA "0.0"> <!ATTLIST Rotation rotation CDATA "0.0"> - <!ELEMENT Scale EMPTY> <!ATTLIST Scale scale CDATA "1.0"> Modified: armagetronad/trunk/armagetronad/src/tron/gParser.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gParser.cpp 2008-02-23 01:09:06 UTC (rev 8075) +++ armagetronad/trunk/armagetronad/src/tron/gParser.cpp 2008-02-23 10:09:12 UTC (rev 8076) @@ -839,17 +839,6 @@ tpm.parse(str); b->set(tpm); - /* - string str = string(myxmlGetProp(cur, "rotationAngle")); - tFunction tfRotationAngle; - myCheapParameterSplitter(str, tfRotationAngle, false); - - str = string(myxmlGetProp(cur, "rotationSpeed")); - tFunction tfRotationSpeed; - myCheapParameterSplitter(str, tfRotationSpeed, false); - - b->set(tfRotationAngle, tfRotationSpeed); - */ infl->addZoneInfluenceRule(zZoneInfluenceItemPtr(b)); } else if (isElement(cur->name, (const xmlChar *)"Scale", keyword)) { @@ -918,28 +907,6 @@ infl->setInfluence( tpmInfluence ); } - if (xmlHasProp(cur, (const xmlChar*)"influenceSlide")) { - string str = string(myxmlGetProp(cur, "influenceSlide")); - tPolynomial<nMessage> tpInfluenceSlide(2); - myCheapParameterSplitter2(str, tpInfluenceSlide, false); - - infl->setInfluenceSlide( tpInfluenceSlide ); - } - - if (xmlHasProp(cur, (const xmlChar *)"influenceAdd")) { - string str = string(myxmlGetProp(cur, "influenceAdd")); - tFunction tfInfluence; - myCheapParameterSplitter(str, tfInfluence, false); - infl->setInfluenceAdd( tfInfluence ); - } - - if (xmlHasProp(cur, (const xmlChar *)"influenceSet")) { - string str = string(myxmlGetProp(cur, "influenceSet")); - tFunction tfInfluence; - myCheapParameterSplitter(str, tfInfluence, false); - infl->setInfluenceSet( tfInfluence ); - } - return infl; } Modified: armagetronad/trunk/armagetronad/src/tron/zone/zMonitor.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/zone/zMonitor.cpp 2008-02-23 01:09:06 UTC (rev 8075) +++ armagetronad/trunk/armagetronad/src/tron/zone/zMonitor.cpp 2008-02-23 10:09:12 UTC (rev 8076) @@ -10,41 +10,19 @@ * Keep track of everybody contributing to the monitor (for a tic atm) */ void -zMonitor::affectSlide(gCycle* user, tPolynomial<nMessage> triggererInfluenceSlide, Triad marked) { +zMonitor::affectSlide(gCycle* user, tPolynomial<nMessage> triggererInfluence, Triad marked) { Triggerer triggerer; triggerer.who = user; // TODO: - //triggerer.positive = triggererInfluenceSlide > 0.0 ? _true : _false; + //triggerer.positive = triggererInfluence > 0.0 ? _true : _false; triggerer.marked = marked; - contributorsSlide.push_back(triggerer); - totalInfluenceSlide += triggererInfluenceSlide; + contributors.push_back(triggerer); + totalInfluence += triggererInfluence; } -void -zMonitor::affectAdd(gCycle* user, REAL triggererInfluenceAdd, Triad marked) { - Triggerer triggerer; - triggerer.who = user; - triggerer.positive = triggererInfluenceAdd > 0.0 ? _true : _false; - triggerer.marked = marked; - contributorsAdd.push_back(triggerer); - totalInfluenceAdd += triggererInfluenceAdd; -} - -void -zMonitor::affectSet(gCycle* user, REAL triggererInfluenceSet, Triad marked) { - Triggerer triggerer; - triggerer.who = user; - triggerer.positive = triggererInfluenceSet > 0.0 ? _true : _false; - triggerer.marked = marked; - - contributorsSet.push_back(triggerer); - totalInfluenceSet += triggererInfluenceSet; -} - - // ******************************************************************************* // * // * Timestep @@ -59,32 +37,17 @@ { tPolynomial<nMessage> prevValueEq = valueEq; - // Do we need to reset the value? - // TODO: Re-enable those 2 lines - // if (contributorsSet.size()!=0) - // valueEq.setUnadjustableOffset(totalInfluenceSet); + if ( totalInfluence != previousTotalInfluenceSlide ) { - // Computer the non-sliding influence - if ( fabs(totalInfluenceAdd - previousTotalInfluenceAdd) > 0.01) { - valueEq.addConstant(totalInfluenceAdd); - - previousTotalInfluenceAdd = totalInfluenceAdd; - } - - // TODO: - // if( fabs(totalInfluenceSlide - previousTotalInfluenceSlide) > 1e-10) { - if ( totalInfluenceSlide != previousTotalInfluenceSlide ) { - // valueEq.addConstant(totalInfluenceSlide[0]); - - for (int i=1; i<totalInfluenceSlide.Len(); i++) { - valueEq.changeRate(totalInfluenceSlide[i], i, time); + for (int i=1; i<totalInfluence.Len(); i++) { + valueEq.changeRate(totalInfluence[i], i, time); } // Set to null any remainding elements not reassigned in the previous loop - for (int i=totalInfluenceSlide.Len(); i<valueEq.Len(); i++) { + for (int i=totalInfluence.Len(); i<valueEq.Len(); i++) { valueEq.changeRate(0.0, i, time); } - previousTotalInfluenceSlide = totalInfluenceSlide; + previousTotalInfluenceSlide = totalInfluence; } valueEq = valueEq.clamp(minValue, maxValue, time); @@ -93,20 +56,10 @@ // Nota: this also protect the list for further modification // by recursives rules. Should all list be merged in a later version // still do make a copy at this step - triggerers contributors = contributorsSlide; - contributors.insertAll(contributorsAdd); - contributors.insertAll(contributorsSet); - // Remove the information about who contributed in the last tic - contributorsSlide.erase(contributorsSlide.begin(), contributorsSlide.end()); - contributorsAdd.erase(contributorsAdd.begin(), contributorsAdd.end()); - contributorsSet.erase(contributorsSet.begin(), contributorsSet.end()); + totalInfluence = drift; - totalInfluenceSlide = drift; - totalInfluenceAdd = 0.0; - totalInfluenceSet = 0.0; - // Only update if value has changed enough // TODO: // if( value < previousValue - EPS || previousValue + EPS < value) { @@ -123,6 +76,9 @@ } // } + // Remove the information about who contributed in the last tic + contributors.erase(contributors.begin(), contributors.end()); + // update time lastTime = time; @@ -223,10 +179,4 @@ tPolynomial<nMessage> tf = influence.marshal(valueEq); monitor->affectSlide(user, tf, marked); - - // TODO: - // if (influenceAddAvailable == true) - // monitor->affectAdd(user, influenceAdd(value), marked); - // if (influenceSetAvailable == true) - // monitor->affectSet(user, influenceSet(value), marked); } Modified: armagetronad/trunk/armagetronad/src/tron/zone/zMonitor.h =================================================================== --- armagetronad/trunk/armagetronad/src/tron/zone/zMonitor.h 2008-02-23 01:09:06 UTC (rev 8075) +++ armagetronad/trunk/armagetronad/src/tron/zone/zMonitor.h 2008-02-23 10:09:12 UTC (rev 8076) @@ -27,19 +27,14 @@ public: zMonitor(eGrid * _grid): eReferencableGameObject( _grid, eCoord( 1,1 ), eCoord( 0,0 ), NULL, true ), - totalInfluenceSlide(0), - totalInfluenceAdd(0.0), - totalInfluenceSet(0.0), - contributorsSlide(), - contributorsAdd(), - contributorsSet(), + totalInfluence(0), + contributors(), rules(), valueEq(), drift(0), minValue(0.0), maxValue(1.0), - previousTotalInfluenceSlide(0), - previousTotalInfluenceAdd(0.0) + previousTotalInfluenceSlide(0) { // add to game grid this->AddToList(); @@ -73,19 +68,13 @@ }; void affectSlide(gCycle* user, tPolynomial<nMessage> triggererInfluenceSlide, Triad marked); - void affectAdd(gCycle* user, REAL triggererInfluenceAdd, Triad marked); - void affectSet(gCycle* user, REAL triggererInfluenceSet, Triad marked); protected: - tPolynomial<nMessage> totalInfluenceSlide; //!< The sum of all the individual contributions in one, to be scaled in time - REAL totalInfluenceAdd; //!< The sum of all the individual contributions, NOT to be scaled in time - REAL totalInfluenceSet; //!< The new value to overwrite the value of the monitor + tPolynomial<nMessage> totalInfluence; //!< The sum of all the individual contributions in one, to be scaled in time virtual bool Timestep(REAL currentTime); //!< simulates behaviour up to currentTime - triggerers contributorsSlide; //!< All the players that contributed to the sliding (ie proportional to time) - triggerers contributorsAdd; //!< All the players that contributed to the unscaled chaning of the value - triggerers contributorsSet; //!< All the players that contributed to the resetting of the value + triggerers contributors; //!< All the players that contributed to the sliding (ie proportional to time) zMonitorRulePtrs rules; @@ -100,8 +89,8 @@ // values used to reduce the update transmitted tPolynomial<nMessage> previousValue; tPolynomial<nMessage> previousTotalInfluenceSlide; - REAL previousTotalInfluenceAdd; + }; @@ -186,12 +175,8 @@ zMonitorPtr monitor; tPolynomialMarshaler influence; tPolynomial<nMessage> influenceSlide; - tFunction influenceAdd; - tFunction influenceSet; bool influenceSlideAvailable; - bool influenceAddAvailable; - bool influenceSetAvailable; Triad marked; @@ -200,11 +185,7 @@ monitor(aMonitor), influence(), influenceSlide(), - influenceAdd(), - influenceSet(), influenceSlideAvailable(false), - influenceAddAvailable(false), - influenceSetAvailable(false), marked(_ignore) { }; ~zMonitorInfluence() { }; @@ -222,14 +203,6 @@ influenceSlide = infl; influenceSlideAvailable=true; }; - void setInfluenceAdd (tFunction infl) { - influenceAdd = infl; - influenceAddAvailable =true; - }; - void setInfluenceSet (tFunction infl) { - influenceSet = infl; - influenceSetAvailable =true; - }; }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <phi...@us...> - 2008-02-24 11:44:19
|
Revision: 8095 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=8095&view=rev Author: philippeqc Date: 2008-02-24 03:44:10 -0800 (Sun, 24 Feb 2008) Log Message: ----------- Some backward compatibility in the parser to tolerate deprecated notation influenceSlide and influenceAdd for the MonitorInfluence element. Some backward compatibility in the parser to tolerate deprecated notation rotationAngle and rotationSpeed for the Rotation element. Modified Paths: -------------- armagetronad/trunk/armagetronad/resource/proto/map-0.3.1-c.dtd armagetronad/trunk/armagetronad/src/tron/gParser.cpp Modified: armagetronad/trunk/armagetronad/resource/proto/map-0.3.1-c.dtd =================================================================== --- armagetronad/trunk/armagetronad/resource/proto/map-0.3.1-c.dtd 2008-02-24 09:44:32 UTC (rev 8094) +++ armagetronad/trunk/armagetronad/resource/proto/map-0.3.1-c.dtd 2008-02-24 11:44:10 UTC (rev 8095) @@ -147,12 +147,17 @@ <!ATTLIST MonitorInfluence name CDATA #IMPLIED> <!ATTLIST MonitorInfluence marked (true | false | ignore) "ignore"> <!ATTLIST MonitorInfluence influence CDATA #IMPLIED> +<!ATTLIST MonitorInfluence influenceSlide CDATA "0.0"> <!-- deprecated as of rev 8042 --> +<!ATTLIST MonitorInfluence influenceAdd CDATA "0.0"> <!-- deprecated as of rev 8042 --> +<!ATTLIST MonitorInfluence influenceSet CDATA "0.0"> <!-- deprecated as of rev 8042 --> <!ELEMENT ZoneInfluence (Rotation | Scale | Point | Color)+ > <!ATTLIST ZoneInfluence name CDATA #IMPLIED> <!ELEMENT Rotation EMPTY> -<!ATTLIST Rotation rotation CDATA "0.0"> +<!ATTLIST Rotation rotation CDATA #IMPLIED> +<!ATTLIST Rotation rotationAngle CDATA "0.0"> <!-- deprecated as of rev 8042 --> +<!ATTLIST Rotation rotationSpeed CDATA "0.0"> <!-- deprecated as of rev 8042 --> <!ELEMENT Scale EMPTY> <!ATTLIST Scale scale CDATA "1.0"> Modified: armagetronad/trunk/armagetronad/src/tron/gParser.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gParser.cpp 2008-02-24 09:44:32 UTC (rev 8094) +++ armagetronad/trunk/armagetronad/src/tron/gParser.cpp 2008-02-24 11:44:10 UTC (rev 8095) @@ -810,9 +810,11 @@ tPolynomialMarshaler<nMessage> tpm; + std::cout << "about to read a rotation " << std::endl; if( myxmlHasProp(cur, "rotation") ) { // new notation, superseed the previous notation string str = string(myxmlGetProp(cur, "rotation")); + tpm.parse(str); } else { @@ -830,6 +832,7 @@ sg_Deprecated(); } + std::cout << "rotation read " << std::endl; b->set(tpm); infl->addZoneInfluenceRule(zZoneInfluenceItemPtr(b)); @@ -891,17 +894,22 @@ zMonitorInfluencePtr infl = zMonitorInfluencePtr(new zMonitorInfluence(ref)); infl->setMarked(myxmlGetPropTriad(cur, "marked")); - tPolynomialMarshaler<nMessage> tpmInfluence; - if (xmlHasProp(cur, (const xmlChar*)"influence")) { - // new notation, superseed the previous notation + if (myxmlHasProp(cur, (const xmlChar*)"influence")) { + // new notation, superseed the previous notation string str = string(myxmlGetProp(cur, "influence")); tpmInfluence.parse(str); } else { - tPolynomial<nMessage> tpInfluenceConstant( string(myxmlGetProp(cur, "influenceAdd")) ); - tPolynomial<nMessage> tpInfluenceVariant( string(myxmlGetProp(cur, "influenceSlide")) ); + tPolynomial<nMessage> tpInfluenceConstant; + tPolynomial<nMessage> tpInfluenceVariant; + if(myxmlHasProp(cur, "influenceAdd")) { + tpInfluenceConstant.parse( string(myxmlGetProp(cur, "influenceAdd")) ); + } + if(myxmlHasProp(cur, "influenceSlide")) { + tpInfluenceVariant.parse( string(myxmlGetProp(cur, "influenceSlide")) ); + } /* if (xmlHasProp(cur, (const xmlChar *)"influenceSet")) { @@ -917,6 +925,7 @@ sg_Deprecated(); } + std::cout << "influence read" << std::endl; infl->setInfluence( tpmInfluence ); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <baz...@us...> - 2008-03-01 09:45:42
|
Revision: 8201 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=8201&view=rev Author: bazaarmagetron Date: 2008-03-01 01:45:44 -0800 (Sat, 01 Mar 2008) Log Message: ----------- Manuel Moos: Disabling title screen when entering the game. Modified Paths: -------------- armagetronad/trunk/armagetronad/src/tron/gGame.cpp Property Changed: ---------------- armagetronad/trunk/armagetronad/ Property changes on: armagetronad/trunk/armagetronad ___________________________________________________________________ Name: bzr:revision-info - timestamp: 2008-02-14 18:02:44.710999966 +0100 committer: Manuel Moos <z-...@us...> properties: branch-nick: armagetronad + timestamp: 2008-03-01 10:39:05.813999891 +0100 committer: Manuel Moos <z-...@us...> properties: branch-nick: armagetronad bugs: https://launchpad.net/bugs/193938 fixed Name: bzr:revision-id:v3-list-QlpoOTFBWSZTWZvbKhsAAAdRgAAQABK6798QIABURMgAAaeoNT1TxT1DQbKaeobXKiyAmlWT7Y5MkdJOtXDtB7w7DOGFBHiOBxaUIu7HQyyQSvxdyRThQkJvbKhs - 613 z-...@us...-20080211141509-cwbrb6hmtz9313jr 626 z-...@us...-20080214170110-rhfpd874zuogr3cm 627 z-...@us...-20080214170244-1gstsfe9yzyvrx9b + 613 z-...@us...-20080211141509-cwbrb6hmtz9313jr 626 z-...@us...-20080214170110-rhfpd874zuogr3cm 627 z-...@us...-20080214170244-1gstsfe9yzyvrx9b 657 z-...@us...-20080301093905-0jwh1zg9srukp8fn Modified: armagetronad/trunk/armagetronad/src/tron/gGame.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gGame.cpp 2008-02-29 18:51:16 UTC (rev 8200) +++ armagetronad/trunk/armagetronad/src/tron/gGame.cpp 2008-03-01 09:45:44 UTC (rev 8201) @@ -3975,6 +3975,8 @@ static void sg_EnterGameCleanup(); void sg_EnterGameCore( nNetState enter_state ){ + gLogo::SetBig(false); + sg_RequestedDisconnection = false; sr_con.SetHeight(7); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <z-...@us...> - 2008-03-03 22:08:21
|
Revision: 8231 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=8231&view=rev Author: z-man Date: 2008-03-03 14:08:03 -0800 (Mon, 03 Mar 2008) Log Message: ----------- Merging branch 0.2.8 from revision 7995 to 8230: ------------------------------------------------------------------------ r8227 | z-man | 2008-03-03 13:51:03 +0100 (Mon, 03 Mar 2008) | 2 lines Repaired dedicated server. ------------------------------------------------------------------------ r8226 | z-man | 2008-03-03 13:48:06 +0100 (Mon, 03 Mar 2008) | 2 lines Added ESC button to server connection that aborts the connection attempt. ------------------------------------------------------------------------ r8225 | z-man | 2008-03-03 12:39:47 +0100 (Mon, 03 Mar 2008) | 8 lines Broke the unfortunate chain of events that leads to severe FPS drops on old clients on several links: - server no longer sends redundant cycle death sync messages. - client ignores redundant cycle death messages; they caused calls to eGameObject::Move on objects already removed from the activity list. - game objects removed from the active lists no longer have currentFace set - game objects removed from the list, when they move, just update their position and don't get a new currentFace. The root of the problem are inactive game objects that still have a currentFace set. That causes that face and all its replacement in the grid reordering code to be marked as "not to be simplified". ------------------------------------------------------------------------ r8224 | z-man | 2008-03-03 12:00:19 +0100 (Mon, 03 Mar 2008) | 2 lines Not contacting master servers when the hostnames don't resolve. ------------------------------------------------------------------------ r8200 | wrtlprnft | 2008-02-29 19:51:16 +0100 (Fri, 29 Feb 2008) | 2 lines Fixed a typo. Maybe this will be another test for the bzr merging thing. ------------------------------------------------------------------------ r8199 | bazaarmagetron | 2008-02-29 19:36:32 +0100 (Fri, 29 Feb 2008) | 2 lines Manuel Moos: Extended allowed letters in authority URLs. ------------------------------------------------------------------------ r8024 | bazaarmagetron | 2008-02-20 23:21:06 +0100 (Wed, 20 Feb 2008) | 2 lines Manuel Moos: Another workaround attempt for the "perfectly stable" OS ATI driver :) Same problem as last time, glColor() call at the end of a glBegin()/glEnd() block. ------------------------------------------------------------------------ r8020 | wrtlprnft | 2008-02-20 21:47:26 +0100 (Wed, 20 Feb 2008) | 2 lines No longer print successful calls to ACCESS_LEVEL and USER_LEVEL to the console when loading a config file at start ------------------------------------------------------------------------ r8019 | wrtlprnft | 2008-02-20 20:39:54 +0100 (Wed, 20 Feb 2008) | 2 lines Added logging of /admin commands ------------------------------------------------------------------------ Revision Links: -------------- http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7995&view=rev Modified Paths: -------------- armagetronad/trunk/armagetronad/language/english_base.txt armagetronad/trunk/armagetronad/src/engine/eGameObject.cpp armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp armagetronad/trunk/armagetronad/src/network/nAuthentication.cpp armagetronad/trunk/armagetronad/src/network/nNetwork.cpp armagetronad/trunk/armagetronad/src/network/nNetwork.h armagetronad/trunk/armagetronad/src/network/nServerInfo.cpp armagetronad/trunk/armagetronad/src/network/nSocket.cpp armagetronad/trunk/armagetronad/src/network/nSocket.h armagetronad/trunk/armagetronad/src/render/rGradient.cpp armagetronad/trunk/armagetronad/src/tools/tConfiguration.cpp armagetronad/trunk/armagetronad/src/tools/tConsole.cpp armagetronad/trunk/armagetronad/src/tools/tConsole.h armagetronad/trunk/armagetronad/src/tron/gArmagetron.cpp armagetronad/trunk/armagetronad/src/tron/gCycle.cpp armagetronad/trunk/armagetronad/src/tron/gCycleMovement.cpp armagetronad/trunk/armagetronad/src/tron/gCycleMovement.h armagetronad/trunk/armagetronad/src/tron/gGame.cpp armagetronad/trunk/armagetronad/src/tron/gWall.cpp armagetronad/trunk/armagetronad/src/ui/uMenu.cpp armagetronad/trunk/armagetronad/src/ui/uMenu.h Modified: armagetronad/trunk/armagetronad/language/english_base.txt =================================================================== --- armagetronad/trunk/armagetronad/language/english_base.txt 2008-03-03 20:38:21 UTC (rev 8230) +++ armagetronad/trunk/armagetronad/language/english_base.txt 2008-03-03 22:08:03 UTC (rev 8231) @@ -2375,6 +2375,7 @@ network_login_failed Login failed.\n network_login_failed_full Login failed: Server is full.\n network_login_failed_timeout Login failed: Timeout.\n +network_login_failed_abort Login failed: Aborted.\n network_login_success Login Succeeded. User Nr. \1 \n network_login_sync Syncing with server...\n network_login_relabeling Relabeling NetObjects...\n @@ -2698,8 +2699,8 @@ # various reasons for logins to fail login_error_aborted Login aborted. -login_error_invalidurl_illegal_hostname Authentication URL \1 invalid, illegal characters in hostname part (only ASCII letters, numbers and dots allowed). -login_error_invalidurl_illegal_path Authentication URL \1 invalid, illegal characters in path part (only ASCII letters, numbers, dots and slashes allowed). +login_error_invalidurl_illegal_hostname Authentication URL \1 invalid, illegal characters in hostname part (only ASCII letters, numbers and a fine selection of other characters are allowed). +login_error_invalidurl_illegal_path Authentication URL \1 invalid, illegal characters in path part (only ASCII letters, numbers, dots, slashes and a fine selection of other characters are allowed). login_error_invalidurl_illegal_port Authentication URL \1 invalid, illegal characters in port (only numbers are allowed). login_error_invalidurl_defaultport Authentication URL \1 invalid. Just leave away the default port, please :). login_error_invalidurl_slash Authentication URL \1 invalid, double slash or ending with slash. Modified: armagetronad/trunk/armagetronad/src/engine/eGameObject.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/engine/eGameObject.cpp 2008-03-03 20:38:21 UTC (rev 8230) +++ armagetronad/trunk/armagetronad/src/engine/eGameObject.cpp 2008-03-03 22:08:03 UTC (rev 8231) @@ -61,6 +61,8 @@ void eGameObject::RemoveFromList(){ int oldID = id; + currentFace = 0; + grid->gameObjects.Remove(this,id); grid->gameObjectsInactive.Add(this,inactiveID); @@ -71,6 +73,8 @@ void eGameObject::RemoveFromListsAll(){ int oldID = id; + currentFace = 0; + grid->gameObjects.Remove(this,id); grid->gameObjectsInactive.Remove(this,inactiveID); grid->gameObjectsInteresting.Remove(this,interestingID); @@ -118,19 +122,8 @@ id=-1; interestingID=-1; inactiveID=-1; - //if (grid) - //{ - // AddToList(); - // FindCurrentFace(); - //} if ( lastTime < 0 ) lastTime=0; - - if ( !currentFace ) - { - FindCurrentFace(); - } - team = 0; } @@ -444,8 +437,12 @@ PassEdge( passing.wall, TIME( (*currentTempCollision).first ), passing.ratio, 0 ); ++ currentTempCollision; } - } + else // !currentFace + { + // just move. + pos = dest; + } // not if the movement timed out // pos=stop; @@ -501,6 +498,16 @@ } } + // don't fetch a new current face if you're out of the game + if ( !currentFace && GOID() < 0 ) + { +#ifdef DEBUG + con << "Attempting to get a current face, but object is not in game.\n"; + st_Breakpoint(); + return; +#endif + } + // did that do the trick? If no, use brute force. if ( !currentFace ) currentFace = grid->FindSurroundingFace(pos); Modified: armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp 2008-03-03 20:38:21 UTC (rev 8230) +++ armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp 2008-03-03 22:08:03 UTC (rev 8231) @@ -2450,6 +2450,11 @@ sn_ConsoleOut( tOutput( "$access_level_admin_denied" ), p->Owner() ); return; } + + tString str; + str.ReadLine(s); + con << "Remote admin command by " << *p << "0xRESETT: " << str << "\n"; + std::istringstream stream(&str(0)); // install filter eAdminConsoleFilter consoleFilter( p->Owner() ); @@ -2460,7 +2465,7 @@ } else { - tConfItemBase::LoadLine(s); + tConfItemBase::LoadLine(stream); } } @@ -4131,14 +4136,20 @@ int levelInt; s >> levelInt; tAccessLevel level = static_cast< tAccessLevel >( levelInt ); - + if ( s.fail() ) { - con << tOutput( "$user_level_usage" ); + if(printErrors) + { + con << tOutput( "$user_level_usage" ); + } return GetDefault(); } - con << tOutput( "$user_level_change", name, tCurrentAccessLevel::GetName( level ) ); + if(printChange) + { + con << tOutput( "$user_level_change", name, tCurrentAccessLevel::GetName( level ) ); + } return level; } Modified: armagetronad/trunk/armagetronad/src/network/nAuthentication.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/network/nAuthentication.cpp 2008-03-03 20:38:21 UTC (rev 8230) +++ armagetronad/trunk/armagetronad/src/network/nAuthentication.cpp 2008-03-03 22:08:03 UTC (rev 8231) @@ -534,6 +534,21 @@ static bool sn_supportRemoteLogins = false; static tSettingItem< bool > sn_supportRemoteLoginsConf( "GLOBAL_ID", sn_supportRemoteLogins ); +// legal characters in authority hostnames(besides alnum and dots) +static bool sn_IsLegalSpecialChar( char c ) +{ + switch (c) + { + case '-': // well, ok, this character actually happens to be in many URLs :) + case '+': // these not, but let's consider them legal. + case '=': + case '_': + return true; + default: + return false; + } +} + // fetches info from remote authority bool nLoginProcess::FetchInfoFromAuthorityRemote() { @@ -556,7 +571,7 @@ std::ostringstream outShort; // stream for shorthand authority std::ostringstream outFull; // stream for full authority URL that is to be used for lookups int c = in.get(); - + // is the authority an abreviation? bool shortcut = true; @@ -597,7 +612,7 @@ slash = true; inHostName = false; } - else + else if ( !sn_IsLegalSpecialChar(c) ) { return ReportAuthorityError( tOutput( "$login_error_invalidurl_illegal_hostname", authority ) ); } @@ -633,7 +648,7 @@ } else { - if (!isalnum(c) && c != '.' && c != '~' ) + if (!isalnum(c) && c != '.' && c != '~' && !sn_IsLegalSpecialChar(c) ) { return ReportAuthorityError( tOutput( "$login_error_invalidurl_illegal_path", authority ) ); } @@ -646,7 +661,7 @@ outShort.put(tolower(c)); outFull.put(c); - + c = in.get(); } if ( slash ) Modified: armagetronad/trunk/armagetronad/src/network/nNetwork.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/network/nNetwork.cpp 2008-03-03 20:38:21 UTC (rev 8230) +++ armagetronad/trunk/armagetronad/src/network/nNetwork.cpp 2008-03-03 22:08:03 UTC (rev 8231) @@ -2735,6 +2735,14 @@ tAdvanceFrame(10000); sn_Receive(); sn_SendPlanned(); + + // check for user abort + if ( tConsole::Idle() ) + { + con << tOutput("$network_login_failed_abort"); + sn_SetNetState(nSTANDALONE); + return nABORT; + } } if (login_failed) { Modified: armagetronad/trunk/armagetronad/src/network/nNetwork.h =================================================================== --- armagetronad/trunk/armagetronad/src/network/nNetwork.h 2008-03-03 20:38:21 UTC (rev 8230) +++ armagetronad/trunk/armagetronad/src/network/nNetwork.h 2008-03-03 22:08:03 UTC (rev 8231) @@ -105,7 +105,7 @@ // We can be single player, multiplayer server/client. typedef enum {nSTANDALONE,nSERVER,nCLIENT} nNetState; -typedef enum {nOK, nTIMEOUT, nDENIED} nConnectError; +typedef enum {nOK, nTIMEOUT, nDENIED, nABORT} nConnectError; // set/get the state Modified: armagetronad/trunk/armagetronad/src/network/nServerInfo.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/network/nServerInfo.cpp 2008-03-03 20:38:21 UTC (rev 8230) +++ armagetronad/trunk/armagetronad/src/network/nServerInfo.cpp 2008-03-03 22:08:03 UTC (rev 8231) @@ -1452,6 +1452,10 @@ { case nOK: break; + case nABORT: + { + return; + } case nTIMEOUT: // delete the master and select a new one if ( multiMaster ) @@ -1652,7 +1656,10 @@ while ( run ) { - TellMasterAboutMe( run ); + if ( run->GetAddress().IsSet() ) + { + TellMasterAboutMe( run ); + } run = run->Next(); } @@ -2416,6 +2423,13 @@ nConnectError nServerInfoBase::Connect( nLoginType loginType, const nSocket * socket ) { + // refuse to connect without address + if ( !GetAddress().IsSet() ) + { + // well, not really a timeout. But we would timeout if we tried to connect. + return nTIMEOUT; + } + //unsigned int portBack = sn_clientPort; //sn_clientPort = port_; if ( GetAddress().ToString().StartsWith( "*.*.*.*" ) ) Modified: armagetronad/trunk/armagetronad/src/network/nSocket.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/network/nSocket.cpp 2008-03-03 20:38:21 UTC (rev 8230) +++ armagetronad/trunk/armagetronad/src/network/nSocket.cpp 2008-03-03 22:08:03 UTC (rev 8231) @@ -1413,8 +1413,24 @@ return *this; } + // ******************************************************************************************* // * +// * IsSet +// * +// ******************************************************************************************* +//! +//! @return true only if address was set to something valid +//! +// ******************************************************************************************* + +bool nAddress::IsSet () const +{ + return addr_.addr_in.sin_addr.s_addr != INADDR_ANY; +} + +// ******************************************************************************************* +// * // * Compare // * // ******************************************************************************************* Modified: armagetronad/trunk/armagetronad/src/network/nSocket.h =================================================================== --- armagetronad/trunk/armagetronad/src/network/nSocket.h 2008-03-03 20:38:21 UTC (rev 8230) +++ armagetronad/trunk/armagetronad/src/network/nSocket.h 2008-03-03 22:08:03 UTC (rev 8231) @@ -90,6 +90,8 @@ int GetPort ( void ) const ; //!< Gets the port of the address nAddress const & GetPort ( int & port ) const ; //!< Gets the port of the address + bool IsSet () const ; //!< returns true only if address is not INETADDR_ANY + static int Compare ( const nAddress & a1, const nAddress & a2 ); //!< compares two addresses operator struct sockaddr * () { return &addr_.addr; } //!< conversion to sockaddr Modified: armagetronad/trunk/armagetronad/src/render/rGradient.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/render/rGradient.cpp 2008-03-03 20:38:21 UTC (rev 8230) +++ armagetronad/trunk/armagetronad/src/render/rGradient.cpp 2008-03-03 22:08:03 UTC (rev 8231) @@ -188,11 +188,13 @@ } void rGradient::BeginDraw() { +#ifndef DEDICATED if(m_tex.Valid()) { m_tex.Select(); } else { glDisable(GL_TEXTURE_2D); } +#endif } //! @param where the point the color should be taken from and drawn Modified: armagetronad/trunk/armagetronad/src/tools/tConfiguration.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tools/tConfiguration.cpp 2008-03-03 20:38:21 UTC (rev 8230) +++ armagetronad/trunk/armagetronad/src/tools/tConfiguration.cpp 2008-03-03 22:08:03 UTC (rev 8231) @@ -135,7 +135,10 @@ if ( s.fail() ) { - con << tOutput( "$access_level_usage" ); + if(printErrors) + { + con << tOutput( "$access_level_usage" ); + } return; } @@ -152,10 +155,13 @@ if ( ci->requiredLevel != level ) { ci->requiredLevel = level; - con << tOutput( "$access_level_change", name, tCurrentAccessLevel::GetName( level ) ); + if(printChange) + { + con << tOutput( "$access_level_change", name, tCurrentAccessLevel::GetName( level ) ); + } } } - else + else if(printErrors) { con << tOutput( "$config_command_unknown", name ); } Modified: armagetronad/trunk/armagetronad/src/tools/tConsole.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tools/tConsole.cpp 2008-03-03 20:38:21 UTC (rev 8230) +++ armagetronad/trunk/armagetronad/src/tools/tConsole.cpp 2008-03-03 22:08:03 UTC (rev 8231) @@ -224,15 +224,15 @@ } -static tConsole::MessageCallback *s_callback = NULL; +static tConsole::MessageCallback *s_messageCallback = NULL; void tConsole::RegisterMessageCallback(MessageCallback *a_callback) { - s_callback = a_callback; + s_messageCallback = a_callback; } bool tConsole::Message(const tOutput& message, const tOutput& interpretation, REAL timeout){ - if (s_callback) - return (*s_callback)(message, interpretation, timeout); + if (s_messageCallback) + return (*s_messageCallback)(message, interpretation, timeout); else { con << tString(message) << ":\n"; @@ -241,6 +241,23 @@ } } +static tConsole::IdleCallback *s_idleCallback = NULL; +void tConsole::RegisterIdleCallback(IdleCallback *a_callback) +{ + s_idleCallback = a_callback; +} + +bool tConsole::Idle(){ + if (s_idleCallback) + { + return (*s_idleCallback)(); + } + else + { + return false; + } +} + tConsole con; Modified: armagetronad/trunk/armagetronad/src/tools/tConsole.h =================================================================== --- armagetronad/trunk/armagetronad/src/tools/tConsole.h 2008-03-03 20:38:21 UTC (rev 8230) +++ armagetronad/trunk/armagetronad/src/tools/tConsole.h 2008-03-03 22:08:03 UTC (rev 8231) @@ -72,6 +72,10 @@ // callback for messages the user should read typedef bool MessageCallback(const tOutput& message, const tOutput& interpretation, REAL timeout); + // idle callback; called from various spots when the progam is waiting. + // return true if the waiting should be aborted + typedef bool IdleCallback(); + virtual ~tConsole(); tConsole & Print(tString s); @@ -87,9 +91,13 @@ // give a message to the user static bool Message(const tOutput& message, const tOutput& interpetation, REAL timeout = -1); + // idle around a bit (return value true: abort whatever you're doing) + static bool Idle(); + virtual tString ColorString(REAL r, REAL g, REAL b) const; static void RegisterMessageCallback(MessageCallback *callback); + static void RegisterIdleCallback(IdleCallback *callback); protected: static void RegisterBetterConsole(tConsole *better); Modified: armagetronad/trunk/armagetronad/src/tron/gArmagetron.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gArmagetron.cpp 2008-03-03 20:38:21 UTC (rev 8230) +++ armagetronad/trunk/armagetronad/src/tron/gArmagetron.cpp 2008-03-03 22:08:03 UTC (rev 8231) @@ -712,6 +712,7 @@ sg_SetIcon(); tConsole::RegisterMessageCallback(&uMenu::Message); + tConsole::RegisterIdleCallback(&uMenu::IdleInput); if (sr_InitDisplay()){ Modified: armagetronad/trunk/armagetronad/src/tron/gCycle.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gCycle.cpp 2008-03-03 20:38:21 UTC (rev 8230) +++ armagetronad/trunk/armagetronad/src/tron/gCycle.cpp 2008-03-03 22:08:03 UTC (rev 8231) @@ -1753,7 +1753,11 @@ ,parent_( 0 ) { // an extrapolator should not be visible as a gameobject from the outside + eFace * currentFaceBack = currentFace; RemoveFromList(); + currentFace = currentFaceBack; + if ( !currentFace ) + currentFace = grid->FindSurroundingFace( pos, currentFace ); } // gCycleExtrapolator::gCycleExtrapolator(nMessage &m); @@ -2543,9 +2547,6 @@ // don't timestep when you're dead if ( !Alive() ) { - if ( sn_GetNetState() == nSERVER ) - RequestSync(); - // die completely Die( lastTime ); @@ -3090,6 +3091,12 @@ void gCycle::Die( REAL time ) { + if ( sn_GetNetState() == nSERVER ) + { + // request one last sync + RequestSync( true ); + } + gCycleMovement::Die( time ); // reset smoothing @@ -3736,9 +3743,6 @@ currentWall = NULL; } - - // request a new sync - RequestSync(); } } // z-man: another stupid idea. Why would we need a destination when we're dead? @@ -5002,6 +5006,12 @@ void gCycle::RequestSyncOwner() { + // no more syncs when you're dead + if ( !Alive() ) + { + return; + } + // nothing to do on the client or if the cycle belongs to an AI if ( sn_GetNetState() != nSERVER || Owner() == 0 ) return; @@ -5017,6 +5027,12 @@ void gCycle::RequestSyncAll() { + // no more syncs when you're dead + if ( !Alive() ) + { + return; + } + // nothing to do on the client or if the cycle belongs to an AI if ( sn_GetNetState() != nSERVER || Owner() == 0 ) return; @@ -5361,6 +5377,15 @@ return; } + // no point going on if you're not alive + if (!Alive()) + { +#ifdef DEBUG + con << "Received duplicate death sync message; those things confuse old clients!\n"; +#endif + return; + } + gDestination emergency_aft(*this); // all the data was read. check where it fits in our destination list: Modified: armagetronad/trunk/armagetronad/src/tron/gCycleMovement.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gCycleMovement.cpp 2008-03-03 20:38:21 UTC (rev 8230) +++ armagetronad/trunk/armagetronad/src/tron/gCycleMovement.cpp 2008-03-03 22:08:03 UTC (rev 8231) @@ -2552,6 +2552,30 @@ maxSpaceHit_ = NULL; } +void gCycleMovement::RequestSync(bool ack) +{ + // no more syncs when you're dead + if ( !Alive() ) + { + return; + } + + // delegate + eNetGameObject::RequestSync( ack ); +} + +void gCycleMovement::RequestSync(int user,bool ack) +{ + // no more syncs when you're dead + if ( !Alive() ) + { + return; + } + + // delegate + eNetGameObject::RequestSync( user, ack ); +} + void gCycleMovement::OnRemoveFromGame() { delete maxSpaceHit_; Modified: armagetronad/trunk/armagetronad/src/tron/gCycleMovement.h =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gCycleMovement.h 2008-03-03 20:38:21 UTC (rev 8230) +++ armagetronad/trunk/armagetronad/src/tron/gCycleMovement.h 2008-03-03 22:08:03 UTC (rev 8231) @@ -140,6 +140,9 @@ gCycleMovement ( nMessage & message ) ; //!< remote constructor virtual ~gCycleMovement () ; //!< destructor virtual void OnRemoveFromGame(); // called when the cycle is physically removed from the game + + void RequestSync(bool ack=true); //!< request a sync + void RequestSync(int user,bool ack); //!< only for a single user protected: //! data from sync message struct SyncData Modified: armagetronad/trunk/armagetronad/src/tron/gGame.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gGame.cpp 2008-03-03 20:38:21 UTC (rev 8230) +++ armagetronad/trunk/armagetronad/src/tron/gGame.cpp 2008-03-03 22:08:03 UTC (rev 8231) @@ -1574,6 +1574,9 @@ switch (error) { + case nABORT: + return false; + break; case nOK: break; case nTIMEOUT: Modified: armagetronad/trunk/armagetronad/src/tron/gWall.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gWall.cpp 2008-03-03 20:38:21 UTC (rev 8230) +++ armagetronad/trunk/armagetronad/src/tron/gWall.cpp 2008-03-03 22:08:03 UTC (rev 8231) @@ -416,6 +416,7 @@ REAL xs = vec.x*vec.x; REAL ys = vec.y*vec.y; REAL intensity = .7 + .3 * xs/(xs+ys); + RenderEnd( true ); Color(intensity, intensity, intensity); } Modified: armagetronad/trunk/armagetronad/src/ui/uMenu.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/ui/uMenu.cpp 2008-03-03 20:38:21 UTC (rev 8230) +++ armagetronad/trunk/armagetronad/src/ui/uMenu.cpp 2008-03-03 22:08:03 UTC (rev 8231) @@ -1325,7 +1325,36 @@ Exec(background_anchor); } +// poll input, return true if ESC was pressed +bool uMenu::IdleInput() +{ +#ifndef DEDICATED + SDL_Event event; + uInputProcessGuard inputProcessGuard; + while (su_GetSDLInput(event)) + { + switch (event.type) + { + case SDL_KEYDOWN: + switch (event.key.keysym.sym) + { + case(SDLK_ESCAPE): + repeat = false; + lastkey=tSysTimeFloat(); + return true; + break; + default: + break; + } + default: + break; + } + } +#endif + return false; +} + // return value: false only if the user pressed ESC bool uMenu::Message(const tOutput& message, const tOutput& interpretation, REAL to){ bool ret = true; Modified: armagetronad/trunk/armagetronad/src/ui/uMenu.h =================================================================== --- armagetronad/trunk/armagetronad/src/ui/uMenu.h 2008-03-03 20:38:21 UTC (rev 8230) +++ armagetronad/trunk/armagetronad/src/ui/uMenu.h 2008-03-03 22:08:03 UTC (rev 8231) @@ -74,6 +74,10 @@ FUNCPTR IdleFunc(){return idle;} static void SetIdle(FUNCPTR idle_func) {idle=idle_func;} + + // poll input, return true if ESC was pressed + static bool IdleInput(); + void SetCenter(REAL c) {center=c;} void SetTop(REAL t) {menuTop=t;} void SetBot(REAL b) {menuBot=b;spaceBelow=1+menuBot;} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <z-...@us...> - 2008-03-07 00:09:27
|
Revision: 8271 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=8271&view=rev Author: z-man Date: 2008-03-06 16:09:25 -0800 (Thu, 06 Mar 2008) Log Message: ----------- Merging branch 0.2.8 from revision 8230 to 8269: ------------------------------------------------------------------------ r8269 | bazaarmagetron | 2008-03-06 19:48:38 +0100 (Thu, 06 Mar 2008) | 2 lines Manuel Moos: added FORTRESS_COLLAPSE_SPEED to control the time between the conquest of a zone and the vanishing (and killing of the team members) ------------------------------------------------------------------------ r8268 | z-man | 2008-03-06 15:37:25 +0100 (Thu, 06 Mar 2008) | 2 lines Fixed screen name reservation. ------------------------------------------------------------------------ r8267 | z-man | 2008-03-06 15:37:02 +0100 (Thu, 06 Mar 2008) | 2 lines Strings get excess zeroes clamped away before they are written over the net. This fixes sporadic network message length discrepancies on playback. I hope the extra zeroes don't do harm elsewhere (string comparison is safe). ------------------------------------------------------------------------ r8266 | z-man | 2008-03-06 13:33:14 +0100 (Thu, 06 Mar 2008) | 2 lines Adding method suffix and prefix to recording. ------------------------------------------------------------------------ r8265 | z-man | 2008-03-06 13:28:06 +0100 (Thu, 06 Mar 2008) | 2 lines Fixed spurious rename message bug; it happened when you authenticated and changed your color during the same round. ------------------------------------------------------------------------ r8264 | z-man | 2008-03-06 13:15:37 +0100 (Thu, 06 Mar 2008) | 2 lines Added login failure reason to playback. ------------------------------------------------------------------------ r8263 | bazaarmagetron | 2008-03-06 01:28:01 +0100 (Thu, 06 Mar 2008) | 2 lines Manuel Moos: Restored behavior that kick votes over the chat interface don't get transformed to removal votes. ------------------------------------------------------------------------ r8262 | bazaarmagetron | 2008-03-06 01:27:22 +0100 (Thu, 06 Mar 2008) | 8 lines author: Manuel Moos All votes are now handled over the new server controlled system internally. For old clients (pre 0.2.8), the vote items disguise as kick votes (if they are kick or suspend votes) and are plainly invisible for include and command votes. The decision to transform a kick into a suspension is now made on vote creation time. ------------------------------------------------------------------------ r8261 | bazaarmagetron | 2008-03-05 22:42:41 +0100 (Wed, 05 Mar 2008) | 2 lines Manuel Moos: Implemented "include" and "command" votes. ------------------------------------------------------------------------ r8260 | bazaarmagetron | 2008-03-05 19:43:01 +0100 (Wed, 05 Mar 2008) | 2 lines Manuel Moos: If the team owning a zone is dead at round end, the zone does not collapse harmlessly; instead, it gets "touchy" and will collapse at the slightest contact with an enemy. ------------------------------------------------------------------------ r8259 | bazaarmagetron | 2008-03-05 15:49:01 +0100 (Wed, 05 Mar 2008) | 2 lines Manuel Moos: Default hiding level adapted to docs: no hiding for anyone. ------------------------------------------------------------------------ r8258 | bazaarmagetron | 2008-03-05 13:20:54 +0100 (Wed, 05 Mar 2008) | 4 lines author: Manuel Moos Added access levels and individual biases for kick and suspend votes. Also added texts and config items for include and direct command votes. ------------------------------------------------------------------------ r8257 | bazaarmagetron | 2008-03-05 12:28:57 +0100 (Wed, 05 Mar 2008) | 2 lines Manuel Moos: Shuffled around access levels. Authenticated now is all on the bottom, only barely above "Program". Default access level for remote users stays 15, only that it's now named "Remote User". ------------------------------------------------------------------------ r8256 | bazaarmagetron | 2008-03-05 11:59:41 +0100 (Wed, 05 Mar 2008) | 2 lines Manuel Moos: Updated config file with new access levels. ------------------------------------------------------------------------ r8255 | bazaarmagetron | 2008-03-05 11:58:43 +0100 (Wed, 05 Mar 2008) | 2 lines Manuel Moos: Added two access levels below authenticated that you can USER_LEVEL players to; intended to be used to take away rights authenticated players usually get (like, starting votes) for selected users. ------------------------------------------------------------------------ r8253 | z-man | 2008-03-05 01:44:40 +0100 (Wed, 05 Mar 2008) | 2 lines Fixed oversized hole bug. ------------------------------------------------------------------------ r8252 | z-man | 2008-03-05 01:09:13 +0100 (Wed, 05 Mar 2008) | 3 lines Disabled debug mode exception for chatbot settings on the server (for debug replays). ------------------------------------------------------------------------ r8251 | z-man | 2008-03-05 01:06:54 +0100 (Wed, 05 Mar 2008) | 2 lines Faster logins in recording mode. ------------------------------------------------------------------------ r8250 | z-man | 2008-03-05 01:06:20 +0100 (Wed, 05 Mar 2008) | 2 lines Ping improvements. I though I committed this yesterday. ------------------------------------------------------------------------ r8249 | bazaarmagetron | 2008-03-04 19:25:58 +0100 (Tue, 04 Mar 2008) | 2 lines Manuel Moos: Added VOTE_KICK_REASON. ------------------------------------------------------------------------ r8248 | bazaarmagetron | 2008-03-04 19:25:15 +0100 (Tue, 04 Mar 2008) | 2 lines Manuel Moos: Added new commands here, too. ------------------------------------------------------------------------ r8247 | bazaarmagetron | 2008-03-04 19:24:48 +0100 (Tue, 04 Mar 2008) | 2 lines Manuel Moos: Added new voting settings items. ------------------------------------------------------------------------ r8246 | z-man | 2008-03-04 18:28:18 +0100 (Tue, 04 Mar 2008) | 2 lines Fixed armathentication compilation. ------------------------------------------------------------------------ r8245 | bazaarmagetron | 2008-03-04 17:47:12 +0100 (Tue, 04 Mar 2008) | 2 lines Manuel Moos: Suspension count is now stored in the eVoter data structure and has limited reconnection resistance. ------------------------------------------------------------------------ r8244 | bazaarmagetron | 2008-03-04 17:29:31 +0100 (Tue, 04 Mar 2008) | 2 lines Manuel Moos: Err, actually letting players into the game again :) ------------------------------------------------------------------------ r8243 | bazaarmagetron | 2008-03-04 17:28:23 +0100 (Tue, 04 Mar 2008) | 2 lines Manuel Moos: Giving players better reasons why they can't join the game. ------------------------------------------------------------------------ r8242 | bazaarmagetron | 2008-03-04 17:16:12 +0100 (Tue, 04 Mar 2008) | 2 lines Manuel Moos: VOTING_KICK_MINHARM now only affects votes that came via the menu. ------------------------------------------------------------------------ r8241 | bazaarmagetron | 2008-03-04 16:39:35 +0100 (Tue, 04 Mar 2008) | 4 lines author: Manuel Moos Added VOTING_HARM_TIME to complement VOTING_KICK_TIME (applies to all harmful votes, currently kicks and suspensions). Added VOTING_KICK_MINHARM to transform the first kick votes against a poor newbie into suspensions automatically. ------------------------------------------------------------------------ r8240 | bazaarmagetron | 2008-03-04 16:15:16 +0100 (Tue, 04 Mar 2008) | 2 lines Manuel Moos: Added VOTING_SUSPEND_ROUNDS to control suspend vote duration. ------------------------------------------------------------------------ r8239 | bazaarmagetron | 2008-03-04 16:14:41 +0100 (Tue, 04 Mar 2008) | 2 lines Manuel Moos: Added "/vote suspend <player>". ------------------------------------------------------------------------ r8238 | bazaarmagetron | 2008-03-04 16:13:56 +0100 (Tue, 04 Mar 2008) | 2 lines Manuel Moos: added "/callvote" ------------------------------------------------------------------------ r8237 | bazaarmagetron | 2008-03-04 15:29:47 +0100 (Tue, 04 Mar 2008) | 2 lines Manuel Moos: finished "/vote kick" vote interface. ------------------------------------------------------------------------ r8236 | bazaarmagetron | 2008-03-04 15:29:00 +0100 (Tue, 04 Mar 2008) | 4 lines author: Manuel Moos Avoiding redundant wall coordinates during holing. This makes the holer information a bit inaccurate; if someone "enlarges" a reviously existing hole, it will belong entirely to him, and not just the new bits. Duplicating last wall coordinate on Update() if there was a hole up to the wall end; this avoids "dragging" the hole along. ------------------------------------------------------------------------ r8235 | bazaarmagetron | 2008-03-04 15:28:00 +0100 (Tue, 04 Mar 2008) | 2 lines Manuel Moos: Filled vote stub for kick votes. ------------------------------------------------------------------------ r8234 | bazaarmagetron | 2008-03-04 15:27:20 +0100 (Tue, 04 Mar 2008) | 2 lines Manuel Moos: Added chat interface stub for votes. ------------------------------------------------------------------------ r8233 | bazaarmagetron | 2008-03-03 23:20:59 +0100 (Mon, 03 Mar 2008) | 2 lines Manuel Moos: Fix ammendment: avoiding short flicker. ------------------------------------------------------------------------ r8232 | bazaarmagetron | 2008-03-03 23:20:29 +0100 (Mon, 03 Mar 2008) | 5 lines author: Manuel Moos Deactivation events no longer minimize the application from fullscreen mode in Linux. The only known source for deactivation events is the screensaver, and ignoring them appears to scare it off :) ------------------------------------------------------------------------ Revision Links: -------------- http://armagetronad.svn.sourceforge.net/armagetronad/?rev=8230&view=rev Modified Paths: -------------- armagetronad/trunk/armagetronad/NEWS armagetronad/trunk/armagetronad/config/settings.cfg armagetronad/trunk/armagetronad/config/settings_authentication.cfg armagetronad/trunk/armagetronad/config/settings_dedicated.cfg armagetronad/trunk/armagetronad/language/english_base.txt armagetronad/trunk/armagetronad/language/english_base_notranslate.txt armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp armagetronad/trunk/armagetronad/src/engine/ePlayer.h armagetronad/trunk/armagetronad/src/engine/eTeam.cpp armagetronad/trunk/armagetronad/src/engine/eVoter.cpp armagetronad/trunk/armagetronad/src/engine/eVoter.h armagetronad/trunk/armagetronad/src/network/nAuthentication.cpp armagetronad/trunk/armagetronad/src/network/nKrawallPrivate.cpp armagetronad/trunk/armagetronad/src/network/nNetwork.cpp armagetronad/trunk/armagetronad/src/render/rScreen.cpp armagetronad/trunk/armagetronad/src/tools/tConfiguration.h armagetronad/trunk/armagetronad/src/tron/gCycle.cpp armagetronad/trunk/armagetronad/src/tron/gGame.cpp armagetronad/trunk/armagetronad/src/tron/gWall.cpp armagetronad/trunk/armagetronad/src/tron/gWinZone.h Modified: armagetronad/trunk/armagetronad/NEWS =================================================================== --- armagetronad/trunk/armagetronad/NEWS 2008-03-07 00:07:37 UTC (rev 8270) +++ armagetronad/trunk/armagetronad/NEWS 2008-03-07 00:09:25 UTC (rev 8271) @@ -89,6 +89,13 @@ ------------ New settings and commands: +- VOTE_KICK_REASON: default reason given on kick votes. +- "/vote" chat interface to votes; "/vote kick <player>" issues a kick vote. +- new vote type "/vote suspend <player>" suspends a player for + VOTING_SUSPEND_ROUNDS rounds. +- VOTING_HARM_TIME: time between all harmful votes against a player +- VOTING_KICK_MINHARM: auto-transform the first few menu issued kick + votes to suspensions - (UN)SUSPEND kicks a player to spectator mode with a timeout. Intended to let new players watch before they play. - VOTES_CANCEL cancels all running polls. Modified: armagetronad/trunk/armagetronad/config/settings.cfg =================================================================== --- armagetronad/trunk/armagetronad/config/settings.cfg 2008-03-07 00:07:37 UTC (rev 8270) +++ armagetronad/trunk/armagetronad/config/settings.cfg 2008-03-07 00:09:25 UTC (rev 8271) @@ -527,6 +527,7 @@ # what happens when a zone gets conquered FORTRESS_CONQUERED_SCORE 0 # the conquering party gets this many points (divided among the conquerors) +FORTRESS_HELD_SCORE 0 # points a team owning a zone gets at the end of the round if both team and zone survived FORTRESS_CONQUERED_WIN 0 # if set to 1, the conquering party wins the round FORTRESS_CONQUERED_KILL_MIN 0 # the closest X players of the owning team get killed at least FORTRESS_CONQUERED_KILL_RATIO 0.0 # this fraction of the players of the owning team get killed @@ -536,6 +537,8 @@ SPAWN_POINT_GROUP_SIZE 0 # if > 2, this is interpreted as the number of spawn points in a spawn point group. AA then tries not to spawn one player alone in one spawn point group by redistributing them slightly. +FORTRESS_COLLAPSE_SPEED .5 # speed (units: 1/s) at which a collapsing fortress vanisues. The inverse of this value is the time between the conquest and the time the zone vanishes (and potentially kills its owners) + ############################################################################################ # # backward network compatibility Modified: armagetronad/trunk/armagetronad/config/settings_authentication.cfg =================================================================== --- armagetronad/trunk/armagetronad/config/settings_authentication.cfg 2008-03-07 00:07:37 UTC (rev 8270) +++ armagetronad/trunk/armagetronad/config/settings_authentication.cfg 2008-03-07 00:09:25 UTC (rev 8271) @@ -143,7 +143,11 @@ # 7 Team Leader Leader of a team. By default, no admin rights at all. # 8 Team Member Member of a team. Local team accounts get this level. # 12 Local User Players with local accounts get this level. -# 15 Authenticated Players with remote accounts get this level. +# 15 Remote User Players with remote accounts get this level by default. +# 16 Fallen from Grace Authenticated players who abused default rights given + to them. +# 17 Shunned Same, only worse :) +# 19 Authenticated Minimal level authenticated players can get. # 20 Program Unauthenticated players. # As you see, lower numeric values mean more access rights. When we say @@ -238,6 +242,22 @@ ACCESS_LEVEL_SHUFFLE_UP 8 +# Issuing each vote type also requires a certain access level. By +# default (for unchanged behavior relative to previous versions), +# kick and suspend votes are available for everyone. + +ACCESS_LEVEL_VOTE_REMOVE 20 +ACCESS_LEVEL_VOTE_KICK 20 +ACCESS_LEVEL_VOTE_INCLUDE 2 +ACCESS_LEVEL_VOTE_COMMAND 2 + +# direct command votes will be executed at the access level of the +# vote submitter (usage example: poll for SCORE_HOLE in a tournament +# game), or, if that is higher, the following access level. + +ACCESS_LEVEL_VOTE_INCLUDE_EXECUTE 2 +ACCESS_LEVEL_VOTE_COMMAND_EXECUTE 2 + # Having sufficient rights to use /admin does not entitle you to # use all of the commands; they need to be unlocked for you. # By default, most Admins can use all commands. To change the @@ -419,7 +439,7 @@ # by allowing all players of a certain maximal access level to hide their # identity with -ACCESS_LEVEL_HIDE_OF 15 +ACCESS_LEVEL_HIDE_OF 20 # However, to users of the minimal access level Modified: armagetronad/trunk/armagetronad/config/settings_dedicated.cfg =================================================================== --- armagetronad/trunk/armagetronad/config/settings_dedicated.cfg 2008-03-07 00:07:37 UTC (rev 8270) +++ armagetronad/trunk/armagetronad/config/settings_dedicated.cfg 2008-03-07 00:09:25 UTC (rev 8271) @@ -199,10 +199,11 @@ VOTING_SPAM_ISSUE 1.0 # The spam level of issuing a vote. VOTING_SPAM_REJECT 5.0 # The spam level of getting your vote rejected. +VOTING_KICK_MINHARM 0 # Minimum number of other harmful votes (kicks, suspensions) before a menu-issued kick vote really kicks. Before that, it just suspends. VOTING_KICK_TIME 300 # Minimum time in seconds between kick votes against the same player. +VOTING_HARM_TIME 180 # Minimum time in seconds between harmful votes against the same player. +VOTING_SUSPEND_ROUNDS 5 # Number of rounds "/vote suspend" suspends for. -VOTE_USE_SERVER_CONTROLLED_KICK 0 # Set to 1 to use the enhanced server controlled vote items for kick votes. Does not work for clients prior to 0.2.8.0_rc1. - CONSOLE_DECORATE_ID 1 # Decorates every line of console output with the client ID CONSOLE_DECORATE_IP 0 # Decorates every line of console output with the client IP Modified: armagetronad/trunk/armagetronad/language/english_base.txt =================================================================== --- armagetronad/trunk/armagetronad/language/english_base.txt 2008-03-07 00:07:37 UTC (rev 8270) +++ armagetronad/trunk/armagetronad/language/english_base.txt 2008-03-07 00:09:25 UTC (rev 8271) @@ -452,11 +452,19 @@ voting_start_decay_help Number of seconds after that the non-voters start to get ignored. voting_decay_help One non-voter is ignored everytime this many secons pass. voting_bias_help Add virtual voters that oppose every change. +voting_bias_kick_help Add virtual voters that oppose every kick vote. +voting_bias_suspend_help Add virtual voters that oppose every suspend vote. +voting_bias_include_help Add virtual voters that oppose every include vote. +voting_bias_command_help Add virtual voters that oppose every command vote. + voting_privacy_help Controls logging of voting process. 2: nothing gets logged 1: vote submission is logged for the server admin 0: voting is logged for the server admin -1: vote submission is made public -2: everything is made public voting_spam_issue_help The spam level of issuing a vote. voting_spam_reject_help The spam level of getting your vote rejected. +voting_harm_time_help The minimum time in seconds between two harmful votes against the same player. voting_kick_time_help The minimum time in seconds between two kick votes against the same player. voting_maturity_help The minimum time in seconds a player needs to be online with the same name before he can issue votes. +voting_suspend_rounds_help The number of rounds "/vote suspend <player>" suspends a player for. +voting_kick_minharm_help Minimal number of harmful votes (suspension, kick,..) that need to have been issued (success is not required) against a player before a kick vote issued via the menu really results in a kick; otherwise, the result is a simple suspension. #******************************************** #******************************************** @@ -1515,6 +1523,18 @@ kick_player_text Kick \1 kick_player_help Pressing enter or space on this menu item will issue a kick vote on that player. +suspend_player_details_text If accepted, \1 will be suspended for some rounds. +suspend_player_text Suspend \1 + +vote_include_details_text If accepted, the file \1 will be included as a configuration file. +vote_include_text Include \1 +vote_include_error Include file \1 not found or not readable.\n +vote_include_message Including file \1. Only users of access level \2 or higher will receive the output.\n + +vote_command_details_text If accepted, the console command "\1" will be executed on the server. +vote_command_text Command \1 +vote_command_message Executing command "\1".\n + #************************************* #************************************* # @@ -2204,6 +2224,9 @@ player_teamleave_disallowed Sorry, does not work with automatic team assignment.\n player_teamchanges_disallowed Sorry, the administrator disabled team changes.\n +player_teamchanges_suspended Sorry, you are still suspended from playing for the next \1 round(s).\n +player_teamchanges_accesslevel Sorry, your access level is not high enough to play. You're \1, required would be \2.\n +player_vote_accesslevel Sorry, your access level is not high enough to issue a vote of this type. You're \1, required would be \2.\n player_pingcharity_changed Ping charity changed from \1 to \2.\n spam_protection_repeat SPAM PROTECTION: you already said: \1\n spam_protection SPAM PROTECTION: you are silenced for the next \1 seconds.\n @@ -2434,6 +2457,8 @@ vote_submitted Poll "\2" submitted by \1.\n vote_vote_for \1 voted for Poll "\2".\n vote_vote_against \1 voted against Poll "\2".\n +vote_unknown_command Unknown /vote command \1, available are: \2\n +vote_kick_local Can't vote against local player/AI \1.\n #******************************************** #******************************************** @@ -2580,7 +2605,10 @@ config_accesslevel_7 Team Leader config_accesslevel_8 Team Member config_accesslevel_12 Local User -config_accesslevel_15 Authenticated +config_accesslevel_15 Remote User +config_accesslevel_16 Fallen from Grace +config_accesslevel_17 Shunned +config_accesslevel_19 Authenticated config_accesslevel_20 Program access_level_help Changes the access level of a configuration item to make it available to lower ranked users @@ -2665,7 +2693,14 @@ access_level_play_sliders_help The access level required to play will only slide up if at least this many players of a higher level are online. access_level_play_changed Access level required to play changed from \1 to \2.\n -access_level_chat_timeout_help Time in seconds between public announcements that someone wants to chat, but can't. Set to 0 to disable the public wanrings. +access_level_vote_suspend_help Minimal access level required to issue suspend votes. +access_level_vote_kick_help Minimal access level required to issue kick votes. +access_level_vote_inclue_help Minimal access level required to issue inclue votes. +access_level_vote_include_execute_help Minimal access level successful include votes will be executed at. +access_level_vote_command_help Minimal access level required to issue command votes. +access_level_vote_command_execute_help Minimal access level successful command votes will be executed at. + +access_level_chat_timeout_help Time in seconds between public announcements that someone wants to chat, but can't. Set to 0 to disable the public warnings. access_level_chat_request \10xRESETT would like to chat, but is not authorized yet. Would someone be so kind and say "/op \2" or "/promote \2"?\n access_level_chat_denied 0xff7f7fChat denied,0xffffff insufficient access level.\n access_level_op_denied 0xff7f7f\1 denied,0xffffff insufficient access level.\n Modified: armagetronad/trunk/armagetronad/language/english_base_notranslate.txt =================================================================== --- armagetronad/trunk/armagetronad/language/english_base_notranslate.txt 2008-03-07 00:07:37 UTC (rev 8270) +++ armagetronad/trunk/armagetronad/language/english_base_notranslate.txt 2008-03-07 00:09:25 UTC (rev 8271) @@ -190,7 +190,4 @@ config_accesslevel_11 Recruit-2 config_accesslevel_13 OP-ed config_accesslevel_14 OP-ed-2 -config_accesslevel_16 OP-ed-3 -config_accesslevel_17 OP-ed-4 config_accesslevel_18 OP-ed-5 -config_accesslevel_19 OP-ed-6 Modified: armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp 2008-03-07 00:07:37 UTC (rev 8270) +++ armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp 2008-03-07 00:09:25 UTC (rev 8271) @@ -693,7 +693,7 @@ } // maximal user level whose accounts can be hidden from other users -static tAccessLevel se_hideAccessLevelOf = tAccessLevel_TeamLeader; +static tAccessLevel se_hideAccessLevelOf = tAccessLevel_Program; static tSettingItem< tAccessLevel > se_hideAccessLevelOfConf( "ACCESS_LEVEL_HIDE_OF", se_hideAccessLevelOf ); // but they are only hidden to players with a lower access level than this @@ -737,6 +737,9 @@ } else { + // well, the admin will want to see it. + con << message; + bool canSee[ MAXCLIENTS+1 ]; for( int i = MAXCLIENTS; i>=0; --i ) { @@ -1593,7 +1596,7 @@ } -ePlayerNetID * se_FindPlayerByName( tString const & name, ePlayerNetID * requester = 0 ) +ePlayerNetID * ePlayerNetID::FindPlayerByName( tString const & name, ePlayerNetID * requester ) { int num_matches = 0; @@ -1680,7 +1683,7 @@ return 0; } - return se_FindPlayerByName( player, sender ); + return ePlayerNetID::FindPlayerByName( player, sender ); } // chat message from server to client @@ -3167,6 +3170,10 @@ se_ChatPlayers( p ); return; } + else if (command == "/vote" || command == "/callvote") { + eVoter::HandleChat( p, s ); + return; + } else if (command == "/teams") { se_ChatTeams( p ); return; @@ -3699,7 +3706,6 @@ r = g = b = 15; - suspended_ = 0; greeted = true; chatting_ = false; spectating_ = false; @@ -3767,7 +3773,6 @@ // default access level lastAccessLevel = tAccessLevel_Default; - suspended_ = 0; greeted =false; chatting_ =false; spectating_ =false; @@ -4124,11 +4129,12 @@ eUserLevel() : eUserConfig< tAccessLevel >( "USER_LEVEL" ) { + requiredLevel = tAccessLevel_Owner; } tAccessLevel GetDefault() const { - return tAccessLevel_Authenticated; + return tAccessLevel_DefaultAuthenticated; } virtual tAccessLevel ReadRawVal(tString const & name, std::istream &s) const @@ -4343,7 +4349,7 @@ static void se_CheckAccessLevel( tAccessLevel & level, tString const & authName ) { tAccessLevel newLevel = se_userLevel.Get( authName ); - if ( newLevel < level ) + if ( newLevel < level || newLevel > tAccessLevel_DefaultAuthenticated ) { level = newLevel; } @@ -4384,7 +4390,7 @@ // minimal access level if ( accessLevel_ > tAccessLevel_Authenticated ) { - accessLevel_ = tAccessLevel_Authenticated; + accessLevel_ = static_cast< tAccessLevel >( tAccessLevel_Program - 1 ); } // take over the access level @@ -4399,7 +4405,7 @@ if ( IsHuman() ) { - if ( GetAccessLevel() < tAccessLevel_Authenticated ) + if ( GetAccessLevel() != tAccessLevel_Default ) { se_SecretConsoleOut( tOutput( "$login_message_special", GetName(), @@ -4589,7 +4595,6 @@ #ifdef KRAWALL_SERVER // check for reserved nicknames - if ( !exception ) { tString reservedFor = se_reserveNick.Get( name ); if ( reservedFor != "" && @@ -5997,13 +6002,42 @@ // * team management * // ******************* -bool ePlayerNetID::TeamChangeAllowed() const { - return ( allowTeamChange_ || se_allowTeamChanges ) && ( suspended_ == 0 ) +bool ePlayerNetID::TeamChangeAllowed( bool informPlayer ) const { + if (!( allowTeamChange_ || se_allowTeamChanges )) + { + if ( informPlayer ) + { + sn_ConsoleOut(tOutput("$player_teamchanges_disallowed"), Owner()); + } + return false; + } + + int suspended = GetSuspended(); + if ( suspended > 0 ) + { + if ( informPlayer ) + { + sn_ConsoleOut(tOutput("$player_teamchanges_suspended", suspended ), Owner()); + } + return false; + } + #ifdef KRAWALL_SERVER // only allow players with enough access level to enter the game, everyone is free to leave, though - && ( GetAccessLevel() <= AccessLevelRequiredToPlay() || CurrentTeam() ) + if (!( GetAccessLevel() <= AccessLevelRequiredToPlay() || CurrentTeam() )) + { + if ( informPlayer ) + { + sn_ConsoleOut(tOutput("$player_teamchanges_accesslevel", + tCurrentAccessLevel::GetName( GetAccessLevel() ), + tCurrentAccessLevel::GetName( AccessLevelRequiredToPlay() ) ), + Owner()); + } + return false; + } #endif - ; + + return true; } // put a new player into a default team @@ -6165,8 +6199,7 @@ // check if the team change is legal tASSERT ( nCLIENT != sn_GetNetState() ); - if(!TeamChangeAllowed()) { - sn_ConsoleOut(tOutput("$player_teamchanges_disallowed"), Owner()); + if(!TeamChangeAllowed( true )) { return; } @@ -6300,8 +6333,7 @@ m >> newTeam; - if(!TeamChangeAllowed()) { - sn_ConsoleOut( tOutput( "$player_teamchanges_disallowed" ), Owner() ); + if(!TeamChangeAllowed( true )) { break; } @@ -6433,7 +6465,7 @@ else { // standard name lookup - ePlayerNetID * p = se_FindPlayerByName( name, requester ); + ePlayerNetID * p = ePlayerNetID::FindPlayerByName( name, requester ); if ( p ) { return p->Owner(); @@ -6637,7 +6669,7 @@ } } - return se_FindPlayerByName( name ); + return ePlayerNetID::FindPlayerByName( name ); } static void Kill_conf(std::istream &s) @@ -6832,14 +6864,13 @@ ladder << "PLAYER_RENAMED " << oldLogName_ << " " << logName << " " << nMachine::GetMachine(player_.Owner()).GetIP() << " " << screenName << "\n"; se_SaveToLadderLog(ladder); - - if ( bool(player_.GetVoter() ) ) + if ( oldScreenName_ != screenName ) { - player_.GetVoter()->PlayerChanged(); - } + if ( bool(player_.GetVoter() ) ) + { + player_.GetVoter()->PlayerChanged(); + } - if ( oldPrintName_ != printName ) - { mess << "$player_renamed"; sn_ConsoleOut(mess); @@ -7337,21 +7368,23 @@ rounds = 0; } - if ( suspended_ == rounds ) + int & suspended = AccessSuspended(); + + if ( suspended == rounds ) { return; } - suspended_ = rounds; + suspended = rounds; - if ( suspended_ == 0 ) + if ( suspended == 0 ) { sn_ConsoleOut( tOutput( "$player_no_longer_suspended", GetColoredName() ) ); FindDefaultTeam(); } else { - sn_ConsoleOut( tOutput( "$player_suspended", GetColoredName(), suspended_ ) ); + sn_ConsoleOut( tOutput( "$player_suspended", GetColoredName(), suspended ) ); SetTeam( NULL ); } } @@ -7371,9 +7404,11 @@ { ePlayerNetID* p = se_PlayerNetIDs(i); p->LogScoreDifference(); + + int suspended = p->GetSuspended(); // update suspension count - if ( p->suspended_ > 0 ) + if ( suspended > 0 ) { if ( p->CurrentTeam() && !p->NextTeam() ) { @@ -7381,7 +7416,7 @@ } else { - p->Suspend( p->suspended_ - 1 ); + p->Suspend( suspended - 1 ); } } } @@ -7421,7 +7456,7 @@ if ( p ) { sn_ConsoleOut( tOutput( (allow ? "$player_allowed_teamchange" : "$player_disallowed_teamchange"), p->GetName() ) ); - p->TeamChangeAllowed( allow ); + p->SetTeamChangeAllowed( allow ); } } static void se_allowTeamChangesPlayer(std::istream &s) { @@ -7435,3 +7470,29 @@ static tAccessLevelSetter se_atcConfLevel( se_allowTeamChangesPlayerConf, tAccessLevel_TeamLeader ); static tAccessLevelSetter se_dtcConfLevel( se_disallowTeamChangesPlayerConf, tAccessLevel_TeamLeader ); +//! accesses the suspension count +int & ePlayerNetID::AccessSuspended() +{ + static int dummy; + dummy = 0; + + if ( Owner() == 0 || !GetVoter() ) + { + return dummy; + } + + return GetVoter()->suspended_; +} + +//! returns the suspension count +int ePlayerNetID::GetSuspended() const +{ + int dummy = 0; + + if ( Owner() == 0 || !GetVoter() ) + { + return dummy; + } + + return GetVoter()->suspended_; +} Modified: armagetronad/trunk/armagetronad/src/engine/ePlayer.h =================================================================== --- armagetronad/trunk/armagetronad/src/engine/ePlayer.h 2008-03-07 00:07:37 UTC (rev 8270) +++ armagetronad/trunk/armagetronad/src/engine/ePlayer.h 2008-03-07 00:09:25 UTC (rev 8271) @@ -175,7 +175,6 @@ ePlayerNetID& operator= (const ePlayerNetID&); // forbid copy constructor - int suspended_; //! number of rounds the player is currently suspended from playing bool spectating_; //!< are we currently spectating? Spectators don't get assigned to teams. bool stealth_; //!< does this player want to hide his/her identity? bool chatting_; //!< are we currently chatting? @@ -233,8 +232,8 @@ bool StealthMode() const { return stealth_; } // team management - bool TeamChangeAllowed() const; //!< is this player allowed to change teams? - void TeamChangeAllowed(bool allowed) {allowTeamChange_ = allowed;} //!< set if this player should always be allowed to change teams + bool TeamChangeAllowed( bool informPlayer = false ) const; //!< is this player allowed to change teams? + void SetTeamChangeAllowed(bool allowed) {allowTeamChange_ = allowed;} //!< set if this player should always be allowed to change teams eTeam* NextTeam() const { return nextTeam; } // return the team I will be next round eTeam* CurrentTeam() const { return currentTeam; } // return the team I am in @@ -294,7 +293,7 @@ void SetSilenced( bool silenced ) { silenced_ = silenced; } bool& AccessSilenced( void ) { return silenced_; } - eVoter * GetVoter(){return voter_;} // returns our voter + eVoter * GetVoter() const {return voter_;} // returns our voter void CreateVoter(); // create our voter or find it static void SilenceMenu(); // menu where you can silence players static void PoliceMenu(); // menu where you can silence and kick players @@ -358,21 +357,23 @@ void BeNotLoggedIn() { SetAccessLevel( tAccessLevel_Program ); } tAccessLevel GetLastAccessLevel() const { return lastAccessLevel; } - void UpdateName(); //! update the player name from the client's wishes - static void FilterName( tString const & in, tString & out ); //! filters a name (removes unprintables, color codes and spaces) - static tString FilterName( tString const & in ); //! filters a name (removes unprintables, color codes and spaces) + static ePlayerNetID * FindPlayerByName( tString const & name, ePlayerNetID * requester = 0 ); //!< finds a player by name using lax name matching. Reports errors to the console or to the requesting player. + + void UpdateName(); //!< update the player name from the client's wishes + static void FilterName( tString const & in, tString & out ); //!< filters a name (removes unprintables, color codes and spaces) + static tString FilterName( tString const & in ); //!< filters a name (removes unprintables, color codes and spaces) private: - tColoredString nameFromClient_; //! this player's name as the client wants it to be. Avoid using it when possilbe. - tColoredString nameFromServer_; //! this player's name as the server wants it to be. Avoid using it when possilbe. - tColoredString coloredName_; //! this player's name, cleared by the server. Use this for onscreen screen display. - tString name_; //! this player's name without colors. - tString userName_; //! this player's name, cleared for system logs. Use for writing to files or comparing with admin input. + tColoredString nameFromClient_; //!< this player's name as the client wants it to be. Avoid using it when possilbe. + tColoredString nameFromServer_; //!< this player's name as the server wants it to be. Avoid using it when possilbe. + tColoredString coloredName_; //!< this player's name, cleared by the server. Use this for onscreen screen display. + tString name_; //!< this player's name without colors. + tString userName_; //!< this player's name, cleared for system logs. Use for writing to files or comparing with admin input. #ifdef KRAWALL_SERVER - tString rawAuthenticatedName_; //! the raw authenticated name in user@authority form. + tString rawAuthenticatedName_; //!< the raw authenticated name in user@authority form. #endif - REAL wait_; //! time in seconds WaitToLeaveChat() will wait for this player + REAL wait_; //!< time in seconds WaitToLeaveChat() will wait for this player void MyInitAfterCreation(); @@ -408,6 +409,12 @@ private: inline ePlayerNetID & SetNameFromClient( tColoredString const & nameFromClient ); //!< Sets this player's name as the client wants it to be. Avoid using it when possilbe. inline ePlayerNetID & SetColoredName( tColoredString const & coloredName ); //!< Sets this player's name, cleared by the server. Use this for onscreen screen display. + + //! accesses the suspension count + int & AccessSuspended(); + + //! returns the suspension count + int GetSuspended() const; }; extern tList<ePlayerNetID> se_PlayerNetIDs; Modified: armagetronad/trunk/armagetronad/src/engine/eTeam.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/engine/eTeam.cpp 2008-03-07 00:07:37 UTC (rev 8270) +++ armagetronad/trunk/armagetronad/src/engine/eTeam.cpp 2008-03-07 00:09:25 UTC (rev 8271) @@ -1023,8 +1023,8 @@ return true; // suspended players cannot join - if ( player->suspended_ > 0 ) - return true; + if ( player->GetSuspended() > 0 ) + return false; // check for invitations. Not with those shoes! if ( IsLocked() && !IsInvited( player ) ) Modified: armagetronad/trunk/armagetronad/src/engine/eVoter.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/engine/eVoter.cpp 2008-03-07 00:07:37 UTC (rev 8270) +++ armagetronad/trunk/armagetronad/src/engine/eVoter.cpp 2008-03-07 00:09:25 UTC (rev 8271) @@ -31,6 +31,7 @@ #include "tMemManager.h" #include "tSysTime.h" +#include "tDirectories.h" #include "uMenu.h" @@ -42,10 +43,6 @@ #include "ePlayer.h" #include "eGrid.h" -// use server controlled votes -static bool se_useServerControlledKick = false; -static nSettingItemWatched< bool > se_usc( "VOTE_USE_SERVER_CONTROLLED_KICK", se_useServerControlledKick, nConfItemVersionWatcher::Group_Annoying, 10 ); - // basic vote timeout value static unsigned short se_votingItemID = 0; static float se_votingTimeout = 300.0f; @@ -75,6 +72,10 @@ static bool se_allowVotingSpectator = false; static tSettingItem< bool > se_avo( "ALLOW_VOTING_SPECTATOR", se_allowVotingSpectator ); +// number of rounds to suspend +static int se_suspendRounds = 5; +static tSettingItem< int > se_sr( "VOTING_SUSPEND_ROUNDS", se_suspendRounds ); + static int se_minVoters = 3; static tSettingItem< int > se_mv( "MIN_VOTERS", se_minVoters ); @@ -82,6 +83,22 @@ static int se_votingBias = 0; static tSettingItem< int > se_vb( "VOTING_BIAS", se_votingBias ); +// the number set here always acts as additional votes against a kick vote. +static int se_votingBiasKick = 0; +static tSettingItem< int > se_vbKick( "VOTING_BIAS_KICK", se_votingBiasKick ); + +// the number set here always acts as additional votes against a suspend vote. +static int se_votingBiasSuspend = 0; +static tSettingItem< int > se_vbSuspend( "VOTING_BIAS_SUSPEND", se_votingBiasSuspend ); + +// the number set here always acts as additional votes against a suspend vote. +static int se_votingBiasInclude = 0; +static tSettingItem< int > se_vbInclude( "VOTING_BIAS_INCLUDE", se_votingBiasInclude ); + +// the number set here always acts as additional votes against a command vote. +static int se_votingBiasCommand = 0; +static tSettingItem< int > se_vbCommand( "VOTING_BIAS_COMMAND", se_votingBiasCommand ); + // voting privacy level. -2 means total disclosure, +2 total secrecy. static int se_votingPrivacy = 1; static tSettingItem< int > se_vp( "VOTING_PRIVACY", se_votingPrivacy ); @@ -98,15 +115,69 @@ static int se_minTimeBetweenKicks = 300; static tSettingItem< int > se_minTimeBetweenKicksSI( "VOTING_KICK_TIME", se_minTimeBetweenKicks ); +// time between harmful votes against the same target in seconds +static int se_minTimeBetweenHarms = 180; +static tSettingItem< int > se_minTimeBetweenHarmsSI( "VOTING_HARM_TIME", se_minTimeBetweenHarms ); + // time between name changes and you being allowed to issue votes again static int se_votingMaturity = 300; static tSettingItem< int > se_votingMaturitySI( "VOTING_MATURITY", se_votingMaturity ); +#ifdef KRAWALL_SERVER +// minimal access level for kick votes +static tAccessLevel se_accessLevelVoteKick = tAccessLevel_Program; +static tSettingItem< tAccessLevel > se_accessLevelVoteKickSI( "ACCESS_LEVEL_VOTE_KICK", se_accessLevelVoteKick ); + +// minimal access level for suspend votes +static tAccessLevel se_accessLevelVoteSuspend = tAccessLevel_Program; +static tSettingItem< tAccessLevel > se_accessLevelVoteSuspendSI( "ACCESS_LEVEL_VOTE_SUSPEND", se_accessLevelVoteSuspend ); + +// minimal access level for include votes +static tAccessLevel se_accessLevelVoteInclude = tAccessLevel_Moderator; +static tSettingItem< tAccessLevel > se_accessLevelVoteIncludeSI( "ACCESS_LEVEL_VOTE_INCLUDE", se_accessLevelVoteInclude ); + +// minimal access level for include votes +static tAccessLevel se_accessLevelVoteIncludeExecute = tAccessLevel_Moderator; +static tSettingItem< tAccessLevel > se_accessLevelVoteIncludeExecuteSI( "ACCESS_LEVEL_VOTE_INCLUDE_EXECUTE", se_accessLevelVoteIncludeExecute ); + +// minimal access level for direct command votes +static tAccessLevel se_accessLevelVoteCommand = tAccessLevel_Moderator; +static tSettingItem< tAccessLevel > se_accessLevelVoteCommandSI( "ACCESS_LEVEL_VOTE_COMMAND", se_accessLevelVoteCommand ); + +// access level direct command votes will be executed with (minimal level is, +// however, the access level of the vote submitter) +static tAccessLevel se_accessLevelVoteCommandExecute = tAccessLevel_Moderator; +static tSettingItem< tAccessLevel > se_accessLevelVoteCommandExecuteSI( "ACCESS_LEVEL_VOTE_COMMAND_EXECUTE", se_accessLevelVoteCommandExecute ); +#endif + static eVoter* se_GetVoter( const nMessage& m ) { return eVoter::GetVoter( m.SenderID(), true ); } +eVoterPlayerInfo::eVoterPlayerInfo(): suspended_(0){} + +static tAccessLevel se_GetAccessLevel( int userID ) +{ + tAccessLevel ret = tAccessLevel_Default; + + // scan players of given user ID + for ( int i = se_PlayerNetIDs.Len()-1; i>=0; --i ) + { + ePlayerNetID* p = se_PlayerNetIDs(i); + + if ( p->Owner() == userID ) + { + if( p->GetAccessLevel() < ret ) + { + ret = p->GetAccessLevel(); + } + } + } + + return ret; +} + // something to vote on class eVoteItem: public tListMember { @@ -130,6 +201,16 @@ if ( !DoFillFromMessage( m ) ) return false; + if ( !CheckValid( m.SenderID() ) ) + return false; + + ReBroadcast( m.SenderID() ); + return true; + } + + + void ReBroadcast( int exceptTo = -1 ) + { // rebroadcast message to all non-voters that may be able to vote if ( sn_GetNetState() == nSERVER ) { @@ -145,12 +226,23 @@ else if ( se_votingPrivacy <= 1 ) con << voteMessage; // print it for the server admin - tJUST_CONTROLLED_PTR< nMessage > ret = this->CreateMessage(); + static nVersionFeature serverControlledVotes( 10 ); + + // create messages for old and new clients + tJUST_CONTROLLED_PTR< nMessage > retNew = this->CreateMessage(); + tJUST_CONTROLLED_PTR< nMessage > retLegacy = this->CreateMessageLegacy(); for ( int i = MAXCLIENTS; i > 0; --i ) { - if ( sn_Connections[ i ].socket && i != m.SenderID() && 0 != eVoter::GetVoter( i ) ) + if ( sn_Connections[ i ].socket && i != exceptTo && 0 != eVoter::GetVoter( i ) ) { - ret->Send( i ); + if ( serverControlledVotes.Supported( i ) ) + { + retNew->Send( i ); + } + else if ( retLegacy ) + { + retLegacy->Send( i ); + } } } // item->SendMessage(); @@ -159,8 +251,6 @@ con << tOutput( "$vote_new", GetDescription() ); this->Evaluate(); - - return true; }; nMessage* CreateMessage( void ) const @@ -170,6 +260,21 @@ return m; } + nMessage* CreateMessageLegacy( void ) const + { + nDescriptor * descriptor = this->DoGetDescriptorLegacy(); + if ( descriptor ) + { + nMessage* m = tNEW( nMessage )( *descriptor ); + this->DoFillToMessageLegacy( *m ); + return m; + } + else + { + return 0; + } + } + void SendMessage( void ) const { this->CreateMessage()->BroadCast(); @@ -178,7 +283,7 @@ // message sending void Vote( bool accept ); // called on the clients to accept or decline the vote - static bool AcceptNewVote( nMessage& m ) // check if a new voting item should be accepted + static bool AcceptNewVote( eVoter * voter, int senderID ) // check if a new voting item should be accepted { // cloak the ID of the sener for privacy nCurrentSenderID cloak; @@ -197,7 +302,6 @@ if ( sn_GetNetState() == nCLIENT ) return true; - eVoter* voter = se_GetVoter( m ); // check if voting is allowed if ( !voter ) { @@ -208,7 +312,7 @@ if ( !se_allowVoting ) { tOutput message("$vote_disabled"); - sn_ConsoleOut( message, m.SenderID() ); + sn_ConsoleOut( message, senderID ); return false; } @@ -223,12 +327,12 @@ if ( eVoter::voters_.Len() < se_minVoters ) { tOutput message("$vote_toofew"); - sn_ConsoleOut( message, m.SenderID() ); + sn_ConsoleOut( message, senderID ); return false; } // check for spam - if ( voter->IsSpamming( m.SenderID() ) ) + if ( voter->IsSpamming( senderID ) ) { return false; } @@ -244,23 +348,28 @@ if ( voteCount >= se_maxVotesPerVoter ) { tOutput message("$vote_overflow"); - sn_ConsoleOut( message, m.SenderID() ); + sn_ConsoleOut( message, senderID ); return false; } if ( items_.Len() < se_maxVotes ) { - voter->Spam( m.SenderID(), se_votingSpamIssue, tOutput("$spam_vote_kick_issue") ); + voter->Spam( senderID, se_votingSpamIssue, tOutput("$spam_vote_kick_issue") ); return true; } else { tOutput message("$vote_overflow"); - sn_ConsoleOut( message, m.SenderID() ); + sn_ConsoleOut( message, senderID ); return false; } } + static bool AcceptNewVote( nMessage const & m ) // check if a new voting item should be accepted + { + return AcceptNewVote( se_GetVoter( m ), m.SenderID() ); + } + void RemoveVoter( eVoter* voter ) { // remove voter from the lists @@ -350,6 +459,18 @@ } } + // access level required for this kind of vote + virtual tAccessLevel DoGetAccessLevel() const + { + return tAccessLevel_Default; + } + + // return vote-specific extra bias + virtual int DoGetExtraBias() const + { + return 0; + } + // evaluation virtual void Evaluate() // check if this voting item is to be kept around { @@ -357,9 +478,11 @@ GetStats( pro, con, total ); + int bias = se_votingBias + DoGetExtraBias(); + // apply bias - con += se_votingBias; - total += se_votingBias; + con += bias; + total += bias; // reduce number of total voters if ( se_votingDecay > 0 ) @@ -425,31 +548,64 @@ unsigned short GetID(){ return id_; } void UpdateMenuItem(); // update the menu item about a status change -protected: - virtual bool DoFillFromMessage( nMessage& m ) + + // checks whether the vote is a valid vote to make + bool CheckValid( int senderID ) { - // get user - user_ = m.SenderID(); - - // get originator of vote - if(sn_GetNetState()==nSERVER) + // fill suggestor + if ( !suggestor_ ) { - suggestor_ = se_GetVoter( m ); + suggestor_ = eVoter::GetVoter( senderID ); if ( !suggestor_ ) return false; // add suggestor to supporters this->voters_[1].Insert( suggestor_ ); + + user_ = senderID; } - else + + // check access level + tAccessLevel accessLevel = se_GetAccessLevel( senderID ); + if ( accessLevel < tCurrentAccessLevel::GetAccessLevel() ) { + accessLevel = tCurrentAccessLevel::GetAccessLevel(); + } + + tAccessLevel required = DoGetAccessLevel(); + if ( accessLevel > required ) + { + sn_ConsoleOut(tOutput("$player_vote_accesslevel", + tCurrentAccessLevel::GetName( accessLevel ), + tCurrentAccessLevel::GetName( required ) ), + senderID ); + + return false; + } + + return DoCheckValid( senderID ); + } + + virtual void Update() //!< update description and details + {} +protected: + virtual bool DoFillFromMessage( nMessage& m ) + { + // get user + user_ = m.SenderID(); + + // get originator of vote + if(sn_GetNetState()!=nSERVER) + { m.Read( id_ ); } return true; }; - virtual void DoFillToMessage( nMessage& m ) const + virtual bool DoCheckValid( int senderID ){ return true; } + + virtual void DoFillToMessage( nMessage& m ) const { if(sn_GetNetState()==nSERVER) { @@ -469,6 +625,16 @@ } static tList< eVoteItem > items_; // list of vote items private: + virtual nDescriptor * DoGetDescriptorLegacy() const // returns the creation descriptor + { + return 0; + } + + virtual void DoFillToMessageLegacy( nMessage& m ) const + { + return DoFillToMessage( m ); + }; + virtual nDescriptor& DoGetDescriptor() const = 0; // returns the creation descriptor virtual tString DoGetDescription() const = 0; // returns the description of the voting item virtual void DoExecute() = 0; // called when the voting was successful @@ -658,8 +824,6 @@ m->BroadCast(); } protected: - virtual void Update() //!< update description and details - {} virtual bool DoFillFromMessage( nMessage& m ) { @@ -761,48 +925,119 @@ static tSettingItem< tString > se_voteKickToServerConf( "VOTE_KICK_TO_SERVER", se_voteKickToServer ); static tSettingItem< int > se_voteKickToPortConf( "VOTE_KICK_TO_PORT", se_voteKickToPort ); +// minimal previous harmful votes (kick, silence, suspend) before +// a successful kick vote really results in a kick. Before that, the result is a +// suspension. +static int se_kickMinHarm = 0; +static tSettingItem< int > se_kickMinHarmSI( "VOTING_KICK_MINHARM", se_kickMinHarm ); + +// reason given on vote kicks +static tString se_voteKickReason(""); +static tConfItemLine se_voteKickReasonConf( "VOTE_KICK_REASON", se_voteKickReason ); + void se_VoteKickUser( int user ) { + if ( user == 0 ) + { + return; + } + + tString reason; + if ( se_voteKickReason.Len() >= 2 ) + { + reason = se_voteKickReason; + } + else + { + reason = tOutput("$voted_kill_kick"); + } + if ( se_voteKickToServer.Len() < 2 ) { - sn_KickUser( user, tOutput("$voted_kill_kick") ); + sn_KickUser( user, reason ); } else { // kick player to default destination nServerInfoRedirect redirect( se_voteKickToServer, se_voteKickToPort ); - sn_KickUser( user, tOutput("$voted_kill_kick"), 1, &redirect ); + sn_KickUser( user, reason, 1, &redirect ); } } -// something to vote on -class eVoteItemKick: public virtual eVoteItem +void se_VoteKickPlayer( ePlayerNetID * p ) { + if ( !p ) + { + return; + } + + se_VoteKickUser( p->Owner() ); +} + +// something to vote on: harming a player +class eVoteItemHarm: public virtual eVoteItem +{ public: // constructors/destructor - eVoteItemKick( ePlayerNetID* player = 0 ) + eVoteItemHarm( ePlayerNetID* player = 0 ) : player_( player ) , machine_(NULL) , name_( "(Player who already left)" ) {} - ~eVoteItemKick() + ~eVoteItemHarm() { delete machine_; machine_ = NULL; } + + // returns the player that is to be harmed + ePlayerNetID * GetPlayer() const + { + ePlayerNetID const * player = player_; + return const_cast< ePlayerNetID * >( player ); + } protected: + // this is a good spot to put in legacy hooks + virtual nDescriptor * DoGetDescriptorLegacy() const + { + return &eVoteItemHarm::DoGetDescriptor(); + } + + virtual void DoFillToMessageLegacy( nMessage& m ) const + { + return eVoteItemHarm::DoFillToMessage( m ); + }; + virtual bool DoFillFromMessage( nMessage& m ) { + // read player ID + unsigned short id; + m.Read(id); + tJUST_CONTROLLED_PTR< ePlayerNetID > p=dynamic_cast<ePlayerNetID *>(nNetObject::ObjectDangerous(id)); + player_ = p; + + return eVoteItem::DoFillFromMessage( m ); + } + + virtual bool DoCheckValid( int senderID ) + { + // always accept votes from server + if ( sn_GetNetState() == nCLIENT && senderID == 0 ) + { + return true; + } + + eVoter * sender = eVoter::GetVoter( senderID ); + double time = tSysTimeFloat(); // check whether the issuer is allowed to start a vote - eVoter * sender = eVoter::GetVoter( m.SenderID() ); if ( sender && sender->lastChange_ + se_votingMaturity > tSysTimeFloat() && sender->lastChange_ * 2 > tSysTimeFloat() ) { REAL time = sender->lastChange_ + se_votingMaturity - tSysTimeFloat(); tOutput message( "$vote_maturity", time ); - sn_ConsoleOut( message, m.SenderID() ); + sn_ConsoleOut( message, senderID ); return false; } @@ -810,38 +1045,40 @@ if ( sender ) sender->lastNameChangePreventor_ = time; - // read player ID - unsigned short id; - m.Read(id); - tJUST_CONTROLLED_PTR< ePlayerNetID > p=dynamic_cast<ePlayerNetID *>(nNetObject::ObjectDangerous(id)); - player_ = p; - // check if player is protected from kicking - if ( p && sn_GetNetState() != nCLIENT ) + if ( player_ && sn_GetNetState() != nCLIENT ) { - name_ = p->GetName(); - eVoter * voter = eVoter::GetVoter( p->Owner() ); + // check whether the player is on the server + if ( player_->Owner() == 0 ) + { + sn_ConsoleOut( tOutput( "$vote_kick_local", player_->GetName() ), senderID ); + return false; + } + + name_ = player_->GetName(); + eVoter * voter = eVoter::GetVoter( player_->Owner() ); if ( voter ) { machine_ = tNEW( nMachineObserver )( voter->machine_ ); - if ( time < voter->lastKickVote_ + se_minTimeBetweenKicks ) + if ( time < voter->lastHarmVote_ + se_minTimeBetweenHarms ) { tOutput message("$vote_redundant"); - sn_ConsoleOut( message, m.SenderID() ); + sn_ConsoleOut( message, senderID ); return false; } else { - voter->lastKickVote_ = time; + voter->lastHarmVote_ = time; voter->lastNameChangePreventor_ = time; } + + // count harmful votes + voter->harmCount_++; } } - eVoteItem::DoFillFromMessage( m ); - - return true; + return eVoteItem::DoCheckValid( senderID ); }; virtual void DoFillToMessage( nMessage& m ) const @@ -853,16 +1090,20 @@ eVoteItem::DoFillToMessage( m ); }; + protected: virtual nDescriptor& DoGetDescriptor() const; // returns the creation descriptor + // get the language string prefix + virtual char const * DoGetPrefix() const = 0; + virtual tString DoGetDescription() const // returns the description of the voting item { // get name from player if ( player_ ) name_ = player_->GetName(); - return tString( tOutput( "$kick_player_text", name_ ) ); + return tString( tOutput( tString("$") + DoGetPrefix() + "_player_text", name_ ) ); } virtual tString DoGetDetails() const // returns the detailed description of the voting item @@ -871,59 +1112,129 @@ if ( player_ ) name_ = player_->GetName(); - return eVoteItem::DoGetDetails() + tString( tOutput( "$kick_player_details_text", name_ ) ); + return eVoteItem::DoGetDetails() + tString( tOutput( tString("$") + DoGetPrefix() + "_player_details_text", name_ ) ); } + nMachine * GetMachine() const + { + if ( !machine_ ) + { + return 0; + } + else + { + return machine_->GetMachine(); + } + } +private: + nObserverPtr< ePlayerNetID > player_; // keep player referenced + nMachineObserver * machine_; // pointer to the machine of the player to be kicked + mutable tString name_; // the name of the player to be kicked +}; + +// something to vote on: kicking a player +class eVoteItemKick: public virtual eVoteItemHarm +{ +public: + // constructors/destructor + eVoteItemKick( ePlayerNetID* player ) + : eVoteItemHarm( player ) + {} + + ~eVoteItemKick() + {} + +protected: + // get the language string prefix + virtual char const * DoGetPrefix() const{ return "kick"; } + +#ifdef KRAWALL_SERVER + // access level required for thi... [truncated message content] |
From: <z-...@us...> - 2008-03-08 16:55:08
|
Revision: 8287 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=8287&view=rev Author: z-man Date: 2008-03-08 08:55:06 -0800 (Sat, 08 Mar 2008) Log Message: ----------- Merging branch 0.2.8 from revision 8269 to 8286: ------------------------------------------------------------------------ r8285 | z-man | 2008-03-08 15:24:06 +0100 (Sat, 08 Mar 2008) | 3 lines Experimenting with different visuals for slowly collapsing zones. Take 1: When conquered, the zone lights up in white, then slows down. When the rotation stops, it darkens. ------------------------------------------------------------------------ r8284 | z-man | 2008-03-08 15:06:41 +0100 (Sat, 08 Mar 2008) | 3 lines Voter datastructure (with a little more persistence than ePlayerNetID) is only used to store suspensions while the ePlayerNetID object does not exist. This avoids suspending everyone connecting from the same LAN all at once. ------------------------------------------------------------------------ r8283 | z-man | 2008-03-08 14:53:19 +0100 (Sat, 08 Mar 2008) | 2 lines Re-added VOTE_USE_SERVER_CONTROLLED_KICK config item on the client to avoid UPGRADE messages. ------------------------------------------------------------------------ r8282 | z-man | 2008-03-08 13:51:07 +0100 (Sat, 08 Mar 2008) | 2 lines Fixed clientside reception of server controlled vote items. ------------------------------------------------------------------------ r8281 | z-man | 2008-03-08 13:49:37 +0100 (Sat, 08 Mar 2008) | 2 lines Added -O0 to debug configuration, just in case. ------------------------------------------------------------------------ r8280 | z-man | 2008-03-08 13:48:27 +0100 (Sat, 08 Mar 2008) | 2 lines Recording fixes for the case when there are errors talking to the authority. ------------------------------------------------------------------------ r8279 | z-man | 2008-03-08 11:49:26 +0100 (Sat, 08 Mar 2008) | 2 lines Added full user name to recording. ------------------------------------------------------------------------ r8278 | z-man | 2008-03-08 11:48:51 +0100 (Sat, 08 Mar 2008) | 2 lines Fixed extra trailing \0 in playback strings. ------------------------------------------------------------------------ r8276 | bazaarmagetron | 2008-03-08 00:57:06 +0100 (Sat, 08 Mar 2008) | 2 lines Manuel Moos: Fixed one vote item delivery bug. There must be another one hiding somewhere, though. ------------------------------------------------------------------------ r8275 | bazaarmagetron | 2008-03-08 00:56:32 +0100 (Sat, 08 Mar 2008) | 2 lines Manuel Moos: Fixed blank screen bug; it was caused by bad tToDo recursion. ------------------------------------------------------------------------ r8273 | z-man | 2008-03-07 14:20:40 +0100 (Fri, 07 Mar 2008) | 2 lines Don't show "IP=<empty>" in /players output. ------------------------------------------------------------------------ r8272 | z-man | 2008-03-07 12:03:02 +0100 (Fri, 07 Mar 2008) | 4 lines Added eGameObject::OnRoundBegin(), called after game object creation. Used it in the zone code to fix the flickering empty zone glitch in sumo, and to avoid rare midgame zone ownership changes. ------------------------------------------------------------------------ Revision Links: -------------- http://armagetronad.svn.sourceforge.net/armagetronad/?rev=8269&view=rev Modified Paths: -------------- armagetronad/trunk/armagetronad/configure.ac armagetronad/trunk/armagetronad/src/engine/eGameObject.cpp armagetronad/trunk/armagetronad/src/engine/eGameObject.h armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp armagetronad/trunk/armagetronad/src/engine/ePlayer.h armagetronad/trunk/armagetronad/src/engine/eVoter.cpp armagetronad/trunk/armagetronad/src/network/nAuthentication.cpp armagetronad/trunk/armagetronad/src/tron/gGame.cpp Modified: armagetronad/trunk/armagetronad/configure.ac =================================================================== --- armagetronad/trunk/armagetronad/configure.ac 2008-03-08 15:27:37 UTC (rev 8286) +++ armagetronad/trunk/armagetronad/configure.ac 2008-03-08 16:55:06 UTC (rev 8287) @@ -292,7 +292,7 @@ dnl default CXX flags: optimize a bit if no optimization optimization has been selected yet test -z "`echo $CXXFLAGS | grep "\-O"`" && CXXFLAGS="$CXXFLAGS -O2" -test $DEBUGLEVEL -ge 1 && CXXFLAGS="`echo $CXXFLAGS | sed -e 's,-O.,,'` -g" +test $DEBUGLEVEL -ge 1 && CXXFLAGS="`echo $CXXFLAGS | sed -e 's,-O.,,'` -g -O0" test $DEBUGLEVEL -ge 2 && CXXFLAGS="$CXXFLAGS -DDEBUG" test $DEBUGLEVEL -ge 3 && enable_memmanager=yes test $DEBUGLEVEL -ge 4 && CXXFLAGS="$CXXFLAGS -DDEBUG_EXPENSIVE" Modified: armagetronad/trunk/armagetronad/src/engine/eGameObject.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/engine/eGameObject.cpp 2008-03-08 15:27:37 UTC (rev 8286) +++ armagetronad/trunk/armagetronad/src/engine/eGameObject.cpp 2008-03-08 16:55:06 UTC (rev 8287) @@ -617,6 +617,7 @@ } // return value: shall this object be destroyed? +void eGameObject::OnRoundBegin(){} void eGameObject::OnRoundEnd(){} void eGameObject::Kill(){} Modified: armagetronad/trunk/armagetronad/src/engine/eGameObject.h =================================================================== --- armagetronad/trunk/armagetronad/src/engine/eGameObject.h 2008-03-08 15:27:37 UTC (rev 8286) +++ armagetronad/trunk/armagetronad/src/engine/eGameObject.h 2008-03-08 16:55:06 UTC (rev 8287) @@ -157,6 +157,10 @@ return w; } + //! called when the round begins, after all game objects have been created, + //! before the first network sync is sent out. + virtual void OnRoundBegin(); + //! called when the round ends virtual void OnRoundEnd(); Modified: armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp 2008-03-08 15:27:37 UTC (rev 8286) +++ armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp 2008-03-08 16:55:06 UTC (rev 8287) @@ -2992,7 +2992,11 @@ } if ( tCurrentAccessLevel::GetAccessLevel() <= se_ipAccessLevel ) { - tos << ", IP = " << p2->GetMachine().GetIP(); + tString IP = p2->GetMachine().GetIP(); + if ( IP.Len() > 1 ) + { + tos << ", IP = " << IP; + } } tos << "\n"; @@ -3712,6 +3716,7 @@ stealth_ = false; chatFlags_ = 0; disconnected = false; + suspended_ = 0; loginWanted = false; @@ -3778,6 +3783,7 @@ spectating_ =false; stealth_ =false; disconnected=false; + suspended_ = 0; chatFlags_ =0; r = g = b = 15; @@ -3874,6 +3880,12 @@ // clear old legacy spectator that may be lurking around se_ClearLegacySpectator( Owner() ); + + // get suspension count + if ( GetVoter() ) + { + suspended_ = GetVoter()->suspended_; + } } this->wait_ = 0; @@ -7293,6 +7305,12 @@ { if ( registeredMachine_ ) { + // store suspension count + if ( GetVoter() ) + { + GetVoter()->suspended_ = suspended_; + } + registeredMachine_->RemovePlayer(); registeredMachine_ = 0; } @@ -7473,26 +7491,11 @@ //! accesses the suspension count int & ePlayerNetID::AccessSuspended() { - static int dummy; - dummy = 0; - - if ( Owner() == 0 || !GetVoter() ) - { - return dummy; - } - - return GetVoter()->suspended_; + return suspended_; } //! returns the suspension count int ePlayerNetID::GetSuspended() const { - int dummy = 0; - - if ( Owner() == 0 || !GetVoter() ) - { - return dummy; - } - - return GetVoter()->suspended_; + return suspended_; } Modified: armagetronad/trunk/armagetronad/src/engine/ePlayer.h =================================================================== --- armagetronad/trunk/armagetronad/src/engine/ePlayer.h 2008-03-08 15:27:37 UTC (rev 8286) +++ armagetronad/trunk/armagetronad/src/engine/ePlayer.h 2008-03-08 16:55:06 UTC (rev 8287) @@ -153,6 +153,7 @@ int teamListID; // ID in the list of the team bool silenced_; // flag indicating whether the player has been silenced + int suspended_; //! number of rounds the player is currently suspended from playing nTimeAbsolute timeJoinedTeam; // the time the player joined the team he is in now tCONTROLLED_PTR(eTeam) nextTeam; // the team we're in ( logically ) Modified: armagetronad/trunk/armagetronad/src/engine/eVoter.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/engine/eVoter.cpp 2008-03-08 15:27:37 UTC (rev 8286) +++ armagetronad/trunk/armagetronad/src/engine/eVoter.cpp 2008-03-08 16:55:06 UTC (rev 8287) @@ -43,6 +43,12 @@ #include "ePlayer.h" #include "eGrid.h" +#ifndef DEDICATED +// use server controlled votes (just for the client, to avoid UPGRADE messages) +static bool se_useServerControlledKick = false; +static nSettingItem< bool > se_usc( "VOTE_USE_SERVER_CONTROLLED_KICK", se_useServerControlledKick ); +#endif + // basic vote timeout value static unsigned short se_votingItemID = 0; static float se_votingTimeout = 300.0f; @@ -201,10 +207,13 @@ if ( !DoFillFromMessage( m ) ) return false; - if ( !CheckValid( m.SenderID() ) ) - return false; + if ( sn_GetNetState() == nSERVER ) + { + if ( !CheckValid( m.SenderID() ) ) + return false; - ReBroadcast( m.SenderID() ); + ReBroadcast( m.SenderID() ); + } return true; } @@ -552,6 +561,11 @@ // checks whether the vote is a valid vote to make bool CheckValid( int senderID ) { + if ( sn_GetNetState() != nSERVER ) + { + return true; + } + // fill suggestor if ( !suggestor_ ) { @@ -829,7 +843,7 @@ { m >> description_; m >> details_; - return true; + return eVoteItem::DoFillFromMessage( m ); }; virtual void DoFillToMessage( nMessage& m ) const @@ -881,7 +895,7 @@ static void se_HandleNewServerVote( nMessage& m ) { - if ( eVoteItem::AcceptNewVote( m ) ) + if ( sn_GetNetState() != nCLIENT || eVoteItem::AcceptNewVote( m ) ) { // accept message eVoteItem* item = tNEW( eVoteItemServerControlled )(); @@ -1350,7 +1364,7 @@ { // no objection? Broadcast it to everyone. item->Update(); - item->ReBroadcast( p->Owner() ); + item->ReBroadcast( senderID ); } // and cancel this item here. Modified: armagetronad/trunk/armagetronad/src/network/nAuthentication.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/network/nAuthentication.cpp 2008-03-08 15:27:37 UTC (rev 8286) +++ armagetronad/trunk/armagetronad/src/network/nAuthentication.cpp 2008-03-08 16:55:06 UTC (rev 8287) @@ -520,14 +520,21 @@ tRecorder::Playback( section, method.prefix ); tRecorder::Playback( section, method.suffix ); tRecorder::Playback( section, authority ); + tRecorder::Playback( section, error ); tRecorder::Record( section, ret ); tRecorder::Record( section, method.method ); tRecorder::Record( section, method.prefix ); tRecorder::Record( section, method.suffix ); tRecorder::Record( section, authority ); + tRecorder::Record( section, error ); if ( !ret ) { + if ( tRecorder::IsPlayingBack() ) + { + Abort(); + } + return; } @@ -951,9 +958,11 @@ // exploitable information for password theft: the scrambled password // stored in the incoming network stream has an unknown salt value. ) static char const * section = "AUTH_RESULT"; + tRecorder::Playback( section, username ); tRecorder::Playback( section, success ); tRecorder::Playback( section, authority ); tRecorder::Playback( section, error ); + tRecorder::Record( section, username ); tRecorder::Record( section, success ); tRecorder::Record( section, authority ); tRecorder::Record( section, error ); Modified: armagetronad/trunk/armagetronad/src/tron/gGame.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gGame.cpp 2008-03-08 15:27:37 UTC (rev 8286) +++ armagetronad/trunk/armagetronad/src/tron/gGame.cpp 2008-03-08 16:55:06 UTC (rev 8287) @@ -2579,9 +2579,6 @@ // unsigned short int mes1 = 1, mes2 = 1, mes3 = 1, mes4 = 1, mes5 = 1; - // now would be a good time to tend for pending tasks - nAuthentication::OnBreak(); - switch (state){ case GS_DELETE_GRID: // sr_con.autoDisplayAtNewline=true; @@ -2669,6 +2666,19 @@ ePlayerNetID::RankingLadderLog(); + // do round begin stuff + { + const tList<eGameObject>& gameObjects = Grid()->GameObjects(); + for (int i=gameObjects.Len()-1;i>=0;i--) + { + eGameObject * e = gameObjects(i); + if ( e ) + { + e->OnRoundBegin(); + } + } + } + // do the first analysis of the round, now is the time to get it used to the number of teams Analysis( -1000 ); @@ -2847,6 +2857,10 @@ default: break; } + + // now would be a good time to tend for pending tasks + nAuthentication::OnBreak(); + if (sn_GetNetState()==nSERVER){ NetSyncIdle(); RequestSync(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <nem...@us...> - 2008-03-09 18:02:34
|
Revision: 8297 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=8297&view=rev Author: nemostultae Date: 2008-03-09 11:02:20 -0700 (Sun, 09 Mar 2008) Log Message: ----------- Restored building trunk on Mac OS X Modified Paths: -------------- armagetronad/trunk/armagetronad/MacOS/Armagetron Advanced.xcodeproj/project.pbxproj armagetronad/trunk/armagetronad/src/macosx/Info.plist Added Paths: ----------- armagetronad/trunk/armagetronad/MacOS/rakefile.rb armagetronad/trunk/armagetronad/MacOS/rakelib/ armagetronad/trunk/armagetronad/MacOS/rakelib/xcode.rake armagetronad/trunk/armagetronad/MacOS/shared.xcconfig armagetronad/trunk/armagetronad/src/macosx/config_common.h Removed Paths: ------------- armagetronad/trunk/armagetronad/MacOS/Rakefile armagetronad/trunk/armagetronad/src/macosx/config_common.h.in Property Changed: ---------------- armagetronad/trunk/armagetronad/MacOS/Armagetron Advanced.xcodeproj/ Property changes on: armagetronad/trunk/armagetronad/MacOS/Armagetron Advanced.xcodeproj ___________________________________________________________________ Name: svn:ignore - *.mode1 *.pbxuser + *.mode1v3 *.mode1 *.pbxuser Modified: armagetronad/trunk/armagetronad/MacOS/Armagetron Advanced.xcodeproj/project.pbxproj =================================================================== --- armagetronad/trunk/armagetronad/MacOS/Armagetron Advanced.xcodeproj/project.pbxproj 2008-03-09 17:10:34 UTC (rev 8296) +++ armagetronad/trunk/armagetronad/MacOS/Armagetron Advanced.xcodeproj/project.pbxproj 2008-03-09 18:02:20 UTC (rev 8297) @@ -7,276 +7,306 @@ objects = { /* Begin PBXBuildFile section */ - 8C11CA4B095A2B6E007AE0EA /* eAdvWall.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E10089EEC7C007E21DC /* eAdvWall.cpp */; }; - 8C11CA4C095A2B6E007AE0EA /* eAuthentification.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E12089EEC7C007E21DC /* eAuthentification.cpp */; }; - 8C11CA4D095A2B6E007AE0EA /* eAxis.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E14089EEC7C007E21DC /* eAxis.cpp */; }; - 8C11CA4E095A2B6E007AE0EA /* eCamera.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E16089EEC7C007E21DC /* eCamera.cpp */; }; - 8C11CA4F095A2B6E007AE0EA /* eDebugLine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E19089EEC7C007E21DC /* eDebugLine.cpp */; }; - 8C11CA50095A2B6E007AE0EA /* eDisplay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E1B089EEC7C007E21DC /* eDisplay.cpp */; }; - 8C11CA51095A2B6E007AE0EA /* eFloor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E1C089EEC7C007E21DC /* eFloor.cpp */; }; - 8C11CA52095A2B6E007AE0EA /* eGameObject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E1E089EEC7C007E21DC /* eGameObject.cpp */; }; - 8C11CA53095A2B6E007AE0EA /* eGrid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E20089EEC7C007E21DC /* eGrid.cpp */; }; - 8C11CA54095A2B6E007AE0EA /* eKrawall.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E22089EEC7D007E21DC /* eKrawall.cpp */; }; - 8C11CA55095A2B6E007AE0EA /* eNetGameObject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E24089EEC7D007E21DC /* eNetGameObject.cpp */; }; - 8C11CA56095A2B6E007AE0EA /* ePath.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E26089EEC7D007E21DC /* ePath.cpp */; }; - 8C11CA57095A2B6E007AE0EA /* ePlayer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E28089EEC7D007E21DC /* ePlayer.cpp */; }; - 8C11CA58095A2B6E007AE0EA /* eRectangle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E2A089EEC7D007E21DC /* eRectangle.cpp */; }; - 8C11CA59095A2B6E007AE0EA /* eSensor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E2C089EEC7D007E21DC /* eSensor.cpp */; }; - 8C11CA5B095A2B6E007AE0EA /* eTeam.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E30089EEC7D007E21DC /* eTeam.cpp */; }; - 8C11CA5C095A2B6E007AE0EA /* eTimer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E33089EEC7D007E21DC /* eTimer.cpp */; }; - 8C11CA5D095A2B6E007AE0EA /* eVoter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E35089EEC7D007E21DC /* eVoter.cpp */; }; - 8C11CA5E095A2B6E007AE0EA /* eWall.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E37089EEC7D007E21DC /* eWall.cpp */; }; - 8C11CA5F095A2B6E007AE0EA /* gAIBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EC4089EEC7D007E21DC /* gAIBase.cpp */; }; - 8C11CA60095A2B6E007AE0EA /* gAICharacter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EC6089EEC7D007E21DC /* gAICharacter.cpp */; }; - 8C11CA61095A2B6E007AE0EA /* gArena.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EC8089EEC7D007E21DC /* gArena.cpp */; }; - 8C11CA62095A2B6E007AE0EA /* gArmagetron.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5ECA089EEC7D007E21DC /* gArmagetron.cpp */; }; - 8C11CA63095A2B6E007AE0EA /* gCamera.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5ECB089EEC7D007E21DC /* gCamera.cpp */; }; - 8C11CA64095A2B6E007AE0EA /* gCycle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5ECD089EEC7D007E21DC /* gCycle.cpp */; }; - 8C11CA65095A2B6E007AE0EA /* gCycleMovement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5ECF089EEC7D007E21DC /* gCycleMovement.cpp */; }; - 8C11CA66095A2B6E007AE0EA /* gExplosion.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5ED1089EEC7D007E21DC /* gExplosion.cpp */; }; - 8C11CA67095A2B6E007AE0EA /* gFloor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5ED3089EEC7D007E21DC /* gFloor.cpp */; }; - 8C11CA68095A2B6E007AE0EA /* gGame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5ED4089EEC7D007E21DC /* gGame.cpp */; }; - 8C11CA6A095A2B6E007AE0EA /* gLanguageMenu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5ED8089EEC7D007E21DC /* gLanguageMenu.cpp */; }; - 8C11CA6B095A2B6E007AE0EA /* gLogo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EDA089EEC7D007E21DC /* gLogo.cpp */; }; - 8C11CA6C095A2B6E007AE0EA /* gMenus.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EDC089EEC7D007E21DC /* gMenus.cpp */; }; - 8C11CA6D095A2B6E007AE0EA /* gParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EDE089EEC7D007E21DC /* gParser.cpp */; }; - 8C11CA6E095A2B6E007AE0EA /* gParticles.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EE0089EEC7D007E21DC /* gParticles.cpp */; }; - 8C11CA6F095A2B6E007AE0EA /* gSensor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EE2089EEC7D007E21DC /* gSensor.cpp */; }; - 8C11CA70095A2B6E007AE0EA /* gServerBrowser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EE4089EEC7D007E21DC /* gServerBrowser.cpp */; }; - 8C11CA71095A2B6E007AE0EA /* gServerFavorites.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EE6089EEC7D007E21DC /* gServerFavorites.cpp */; }; - 8C11CA72095A2B6E007AE0EA /* gSparks.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EE8089EEC7D007E21DC /* gSparks.cpp */; }; - 8C11CA73095A2B6E007AE0EA /* gSpawn.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EEA089EEC7D007E21DC /* gSpawn.cpp */; }; - 8C11CA74095A2B6E007AE0EA /* gStuff.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EEC089EEC7D007E21DC /* gStuff.cpp */; }; - 8C11CA75095A2B6E007AE0EA /* gTeam.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EEE089EEC7D007E21DC /* gTeam.cpp */; }; - 8C11CA76095A2B6E007AE0EA /* gWall.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EF0089EEC7D007E21DC /* gWall.cpp */; }; - 8C11CA78095A2B6E007AE0EA /* md5.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E41089EEC7D007E21DC /* md5.cpp */; }; - 8C11CA79095A2B6E007AE0EA /* nAuthentification.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E43089EEC7D007E21DC /* nAuthentification.cpp */; }; - 8C11CA7A095A2B6E007AE0EA /* nConfig.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E45089EEC7D007E21DC /* nConfig.cpp */; }; - 8C11CA7B095A2B6E007AE0EA /* nKrawall.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E49089EEC7D007E21DC /* nKrawall.cpp */; }; - 8C11CA7C095A2B6E007AE0EA /* nKrawallPrivate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E4B089EEC7D007E21DC /* nKrawallPrivate.cpp */; }; - 8C11CA7D095A2B6E007AE0EA /* nNetObject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E4C089EEC7D007E21DC /* nNetObject.cpp */; }; - 8C11CA7E095A2B6E007AE0EA /* nNetwork.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E4E089EEC7D007E21DC /* nNetwork.cpp */; }; - 8C11CA7F095A2B6E007AE0EA /* nObserver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E50089EEC7D007E21DC /* nObserver.cpp */; }; - 8C11CA80095A2B6E007AE0EA /* nPriorizing.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E52089EEC7D007E21DC /* nPriorizing.cpp */; }; - 8C11CA81095A2B6E007AE0EA /* nServerInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E54089EEC7D007E21DC /* nServerInfo.cpp */; }; - 8C11CA82095A2B6E007AE0EA /* nSocket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E57089EEC7D007E21DC /* nSocket.cpp */; }; - 8C11CA83095A2B6E007AE0EA /* nSpamProtection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E59089EEC7D007E21DC /* nSpamProtection.cpp */; }; - 8C11CA85095A2B6E007AE0EA /* rConsole.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E5F089EEC7D007E21DC /* rConsole.cpp */; }; - 8C11CA87095A2B6E007AE0EA /* rFont.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E63089EEC7D007E21DC /* rFont.cpp */; }; - 8C11CA88095A2B6E007AE0EA /* rGLRender.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E66089EEC7D007E21DC /* rGLRender.cpp */; }; - 8C11CA89095A2B6E007AE0EA /* rModel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E67089EEC7D007E21DC /* rModel.cpp */; }; - 8C11CA8A095A2B6E007AE0EA /* rRender.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E69089EEC7D007E21DC /* rRender.cpp */; }; - 8C11CA8B095A2B6E007AE0EA /* rScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E6B089EEC7D007E21DC /* rScreen.cpp */; }; - 8C11CA8C095A2B6E007AE0EA /* rSysdep.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E6E089EEC7D007E21DC /* rSysdep.cpp */; }; - 8C11CA8D095A2B6E007AE0EA /* rTexture.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E70089EEC7D007E21DC /* rTexture.cpp */; }; - 8C11CA8E095A2B6E007AE0EA /* rViewport.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E72089EEC7D007E21DC /* rViewport.cpp */; }; - 8C11CA91095A2B6E007AE0EA /* tArray.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E8A089EEC7D007E21DC /* tArray.cpp */; }; - 8C11CA92095A2B6E007AE0EA /* tCallback.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E8C089EEC7D007E21DC /* tCallback.cpp */; }; - 8C11CA93095A2B6E007AE0EA /* tCommandLine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E90089EEC7D007E21DC /* tCommandLine.cpp */; }; - 8C11CA94095A2B6E007AE0EA /* tConfiguration.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E92089EEC7D007E21DC /* tConfiguration.cpp */; }; - 8C11CA95095A2B6E007AE0EA /* tConsole.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E94089EEC7D007E21DC /* tConsole.cpp */; }; - 8C11CA96095A2B6E007AE0EA /* tCrypt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E96089EEC7D007E21DC /* tCrypt.cpp */; }; - 8C11CA97095A2B6E007AE0EA /* tDirectories.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E98089EEC7D007E21DC /* tDirectories.cpp */; }; - 8C11CA98095A2B6E007AE0EA /* tError.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E9A089EEC7D007E21DC /* tError.cpp */; }; - 8C11CA99095A2B6E007AE0EA /* tEventQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E9C089EEC7D007E21DC /* tEventQueue.cpp */; }; - 8C11CA9A095A2B6E007AE0EA /* tException.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E9E089EEC7D007E21DC /* tException.cpp */; }; - 8C11CA9B095A2B6E007AE0EA /* tHeap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EA0089EEC7D007E21DC /* tHeap.cpp */; }; - 8C11CA9C095A2B6E007AE0EA /* tLinkedList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EA3089EEC7D007E21DC /* tLinkedList.cpp */; }; - 8C11CA9D095A2B6E007AE0EA /* tLocale.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EA6089EEC7D007E21DC /* tLocale.cpp */; }; - 8C11CA9E095A2B6E007AE0EA /* tMemManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EA9089EEC7D007E21DC /* tMemManager.cpp */; }; - 8C11CA9F095A2B6E007AE0EA /* tMemStack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EAB089EEC7D007E21DC /* tMemStack.cpp */; }; - 8C11CAA0095A2B6E007AE0EA /* tRandom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EAD089EEC7D007E21DC /* tRandom.cpp */; }; - 8C11CAA3095A2B6E007AE0EA /* tResourceManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EB5089EEC7D007E21DC /* tResourceManager.cpp */; }; - 8C11CAA4095A2B6E007AE0EA /* tRing.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EB7089EEC7D007E21DC /* tRing.cpp */; }; - 8C11CAA5095A2B6E007AE0EA /* tSafePTR.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EB9089EEC7D007E21DC /* tSafePTR.cpp */; }; - 8C11CAA6095A2B6E007AE0EA /* tString.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EBC089EEC7D007E21DC /* tString.cpp */; }; - 8C11CAA7095A2B6E007AE0EA /* tSysTime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EBE089EEC7D007E21DC /* tSysTime.cpp */; }; - 8C11CAA8095A2B6E007AE0EA /* tToDo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EC0089EEC7D007E21DC /* tToDo.cpp */; }; - 8C11CAA9095A2B6E007AE0EA /* uInput.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EF6089EEC7D007E21DC /* uInput.cpp */; }; - 8C11CAAA095A2B6E007AE0EA /* uInputQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EF8089EEC7E007E21DC /* uInputQueue.cpp */; }; - 8C11CAAB095A2B6E007AE0EA /* uMenu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EFA089EEC7E007E21DC /* uMenu.cpp */; }; - 8C1AB77E09A3D2D9007E2048 /* AAURLHandler.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8C1AB77D09A3D2D9007E2048 /* AAURLHandler.mm */; }; - 8C1D3881099D3DAF00A334A8 /* eSoundMixer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8C1D387F099D3DAF00A334A8 /* eSoundMixer.cpp */; }; - 8C1D3883099D3DAF00A334A8 /* eSoundMixer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8C1D387F099D3DAF00A334A8 /* eSoundMixer.cpp */; }; - 8CAA3EF3099D3BB6001CB80C /* uWebinterface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CAA3EF1099D3BB6001CB80C /* uWebinterface.cpp */; }; - 8CAA3EF5099D3BB6001CB80C /* uWebinterface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CAA3EF1099D3BB6001CB80C /* uWebinterface.cpp */; }; - 8CAA3EFD099D3BDF001CB80C /* gStatistics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CAA3EF9099D3BDF001CB80C /* gStatistics.cpp */; }; - 8CAA3EFF099D3BDF001CB80C /* gStatList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CAA3EFB099D3BDF001CB80C /* gStatList.cpp */; }; - 8CAA3F01099D3BDF001CB80C /* gStatistics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CAA3EF9099D3BDF001CB80C /* gStatistics.cpp */; }; - 8CAA3F03099D3BDF001CB80C /* gStatList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CAA3EFB099D3BDF001CB80C /* gStatList.cpp */; }; - 8CAA3F13099D3C3D001CB80C /* tStatEntry.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CAA3F0D099D3C3D001CB80C /* tStatEntry.cpp */; }; - 8CAA3F15099D3C3D001CB80C /* tStatFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CAA3F0F099D3C3D001CB80C /* tStatFile.cpp */; }; - 8CAA3F17099D3C3D001CB80C /* tXmlParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CAA3F11099D3C3D001CB80C /* tXmlParser.cpp */; }; - 8CAA3F19099D3C3D001CB80C /* tStatEntry.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CAA3F0D099D3C3D001CB80C /* tStatEntry.cpp */; }; - 8CAA3F1B099D3C3D001CB80C /* tStatFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CAA3F0F099D3C3D001CB80C /* tStatFile.cpp */; }; - 8CAA3F1D099D3C3D001CB80C /* tXmlParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CAA3F11099D3C3D001CB80C /* tXmlParser.cpp */; }; - 8CAA3F2E099D3CCA001CB80C /* tIniFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CAA3F25099D3CCA001CB80C /* tIniFile.cpp */; }; - 8CAA3F30099D3CCA001CB80C /* tPlayList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CAA3F27099D3CCA001CB80C /* tPlayList.cpp */; }; - 8CAA3F32099D3CCA001CB80C /* tRecorder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CAA3F29099D3CCA001CB80C /* tRecorder.cpp */; }; - 8CAA3F37099D3CCA001CB80C /* tIniFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CAA3F25099D3CCA001CB80C /* tIniFile.cpp */; }; - 8CAA3F39099D3CCA001CB80C /* tPlayList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CAA3F27099D3CCA001CB80C /* tPlayList.cpp */; }; - 8CAA3F3B099D3CCA001CB80C /* tRecorder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CAA3F29099D3CCA001CB80C /* tRecorder.cpp */; }; - 8CAD9141095A37DD00DA0ECC /* rConsoleCout.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CAD9140095A37DD00DA0ECC /* rConsoleCout.cpp */; }; - 8CAED01B09A2890600EE312F /* gCommandLineJumpStart.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CAED01909A2890600EE312F /* gCommandLineJumpStart.cpp */; }; - 8CBA5E0A089EEC5B007E21DC /* SDLMain.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E08089EEC5B007E21DC /* SDLMain.mm */; }; - 8CBA5EFD089EEC7E007E21DC /* eAdvWall.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E10089EEC7C007E21DC /* eAdvWall.cpp */; }; - 8CBA5EFF089EEC7E007E21DC /* eAuthentification.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E12089EEC7C007E21DC /* eAuthentification.cpp */; }; - 8CBA5F01089EEC7E007E21DC /* eAxis.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E14089EEC7C007E21DC /* eAxis.cpp */; }; - 8CBA5F03089EEC7E007E21DC /* eCamera.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E16089EEC7C007E21DC /* eCamera.cpp */; }; - 8CBA5F06089EEC7E007E21DC /* eDebugLine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E19089EEC7C007E21DC /* eDebugLine.cpp */; }; - 8CBA5F08089EEC7E007E21DC /* eDisplay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E1B089EEC7C007E21DC /* eDisplay.cpp */; }; - 8CBA5F09089EEC7E007E21DC /* eFloor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E1C089EEC7C007E21DC /* eFloor.cpp */; }; - 8CBA5F0B089EEC7E007E21DC /* eGameObject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E1E089EEC7C007E21DC /* eGameObject.cpp */; }; - 8CBA5F0D089EEC7E007E21DC /* eGrid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E20089EEC7C007E21DC /* eGrid.cpp */; }; - 8CBA5F0F089EEC7E007E21DC /* eKrawall.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E22089EEC7D007E21DC /* eKrawall.cpp */; }; - 8CBA5F11089EEC7E007E21DC /* eNetGameObject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E24089EEC7D007E21DC /* eNetGameObject.cpp */; }; - 8CBA5F13089EEC7E007E21DC /* ePath.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E26089EEC7D007E21DC /* ePath.cpp */; }; - 8CBA5F15089EEC7E007E21DC /* ePlayer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E28089EEC7D007E21DC /* ePlayer.cpp */; }; - 8CBA5F17089EEC7E007E21DC /* eRectangle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E2A089EEC7D007E21DC /* eRectangle.cpp */; }; - 8CBA5F19089EEC7E007E21DC /* eSensor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E2C089EEC7D007E21DC /* eSensor.cpp */; }; - 8CBA5F1D089EEC7E007E21DC /* eTeam.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E30089EEC7D007E21DC /* eTeam.cpp */; }; - 8CBA5F20089EEC7E007E21DC /* eTimer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E33089EEC7D007E21DC /* eTimer.cpp */; }; - 8CBA5F22089EEC7E007E21DC /* eVoter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E35089EEC7D007E21DC /* eVoter.cpp */; }; - 8CBA5F24089EEC7E007E21DC /* eWall.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E37089EEC7D007E21DC /* eWall.cpp */; }; - 8CBA5F2D089EEC7E007E21DC /* md5.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E41089EEC7D007E21DC /* md5.cpp */; }; - 8CBA5F2F089EEC7E007E21DC /* nAuthentification.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E43089EEC7D007E21DC /* nAuthentification.cpp */; }; - 8CBA5F31089EEC7E007E21DC /* nConfig.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E45089EEC7D007E21DC /* nConfig.cpp */; }; - 8CBA5F35089EEC7E007E21DC /* nKrawall.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E49089EEC7D007E21DC /* nKrawall.cpp */; }; - 8CBA5F37089EEC7E007E21DC /* nKrawallPrivate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E4B089EEC7D007E21DC /* nKrawallPrivate.cpp */; }; - 8CBA5F38089EEC7E007E21DC /* nNetObject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E4C089EEC7D007E21DC /* nNetObject.cpp */; }; - 8CBA5F3A089EEC7E007E21DC /* nNetwork.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E4E089EEC7D007E21DC /* nNetwork.cpp */; }; - 8CBA5F3C089EEC7E007E21DC /* nObserver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E50089EEC7D007E21DC /* nObserver.cpp */; }; - 8CBA5F3E089EEC7E007E21DC /* nPriorizing.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E52089EEC7D007E21DC /* nPriorizing.cpp */; }; - 8CBA5F40089EEC7E007E21DC /* nServerInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E54089EEC7D007E21DC /* nServerInfo.cpp */; }; - 8CBA5F43089EEC7E007E21DC /* nSocket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E57089EEC7D007E21DC /* nSocket.cpp */; }; - 8CBA5F45089EEC7E007E21DC /* nSpamProtection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E59089EEC7D007E21DC /* nSpamProtection.cpp */; }; - 8CBA5F4A089EEC7E007E21DC /* rConsole.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E5F089EEC7D007E21DC /* rConsole.cpp */; }; - 8CBA5F4D089EEC7E007E21DC /* rConsoleGraph.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E62089EEC7D007E21DC /* rConsoleGraph.cpp */; }; - 8CBA5F4E089EEC7E007E21DC /* rFont.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E63089EEC7D007E21DC /* rFont.cpp */; }; - 8CBA5F51089EEC7E007E21DC /* rGLRender.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E66089EEC7D007E21DC /* rGLRender.cpp */; }; - 8CBA5F52089EEC7E007E21DC /* rModel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E67089EEC7D007E21DC /* rModel.cpp */; }; - 8CBA5F54089EEC7E007E21DC /* rRender.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E69089EEC7D007E21DC /* rRender.cpp */; }; - 8CBA5F56089EEC7E007E21DC /* rScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E6B089EEC7D007E21DC /* rScreen.cpp */; }; - 8CBA5F59089EEC7E007E21DC /* rSysdep.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E6E089EEC7D007E21DC /* rSysdep.cpp */; }; - 8CBA5F5B089EEC7E007E21DC /* rTexture.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E70089EEC7D007E21DC /* rTexture.cpp */; }; - 8CBA5F5D089EEC7E007E21DC /* rViewport.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E72089EEC7D007E21DC /* rViewport.cpp */; }; - 8CBA5F71089EEC7E007E21DC /* tArray.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E8A089EEC7D007E21DC /* tArray.cpp */; }; - 8CBA5F73089EEC7E007E21DC /* tCallback.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E8C089EEC7D007E21DC /* tCallback.cpp */; }; - 8CBA5F77089EEC7E007E21DC /* tCommandLine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E90089EEC7D007E21DC /* tCommandLine.cpp */; }; - 8CBA5F79089EEC7E007E21DC /* tConfiguration.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E92089EEC7D007E21DC /* tConfiguration.cpp */; }; - 8CBA5F7B089EEC7E007E21DC /* tConsole.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E94089EEC7D007E21DC /* tConsole.cpp */; }; - 8CBA5F7D089EEC7E007E21DC /* tCrypt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E96089EEC7D007E21DC /* tCrypt.cpp */; }; - 8CBA5F7F089EEC7E007E21DC /* tDirectories.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E98089EEC7D007E21DC /* tDirectories.cpp */; }; - 8CBA5F81089EEC7E007E21DC /* tError.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E9A089EEC7D007E21DC /* tError.cpp */; }; - 8CBA5F83089EEC7E007E21DC /* tEventQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E9C089EEC7D007E21DC /* tEventQueue.cpp */; }; - 8CBA5F85089EEC7E007E21DC /* tException.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5E9E089EEC7D007E21DC /* tException.cpp */; }; - 8CBA5F87089EEC7E007E21DC /* tHeap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EA0089EEC7D007E21DC /* tHeap.cpp */; }; - 8CBA5F8A089EEC7E007E21DC /* tLinkedList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EA3089EEC7D007E21DC /* tLinkedList.cpp */; }; - 8CBA5F8D089EEC7E007E21DC /* tLocale.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EA6089EEC7D007E21DC /* tLocale.cpp */; }; - 8CBA5F90089EEC7E007E21DC /* tMemManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EA9089EEC7D007E21DC /* tMemManager.cpp */; }; - 8CBA5F92089EEC7E007E21DC /* tMemStack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EAB089EEC7D007E21DC /* tMemStack.cpp */; }; - 8CBA5F94089EEC7E007E21DC /* tRandom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EAD089EEC7D007E21DC /* tRandom.cpp */; }; - 8CBA5F9C089EEC7E007E21DC /* tResourceManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EB5089EEC7D007E21DC /* tResourceManager.cpp */; }; - 8CBA5F9E089EEC7E007E21DC /* tRing.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EB7089EEC7D007E21DC /* tRing.cpp */; }; - 8CBA5FA0089EEC7E007E21DC /* tSafePTR.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EB9089EEC7D007E21DC /* tSafePTR.cpp */; }; - 8CBA5FA3089EEC7E007E21DC /* tString.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EBC089EEC7D007E21DC /* tString.cpp */; }; - 8CBA5FA5089EEC7E007E21DC /* tSysTime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EBE089EEC7D007E21DC /* tSysTime.cpp */; }; - 8CBA5FA7089EEC7E007E21DC /* tToDo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EC0089EEC7D007E21DC /* tToDo.cpp */; }; - 8CBA5FAA089EEC7E007E21DC /* gAIBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EC4089EEC7D007E21DC /* gAIBase.cpp */; }; - 8CBA5FAC089EEC7E007E21DC /* gAICharacter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EC6089EEC7D007E21DC /* gAICharacter.cpp */; }; - 8CBA5FAE089EEC7E007E21DC /* gArena.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EC8089EEC7D007E21DC /* gArena.cpp */; }; - 8CBA5FB0089EEC7E007E21DC /* gArmagetron.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5ECA089EEC7D007E21DC /* gArmagetron.cpp */; }; - 8CBA5FB1089EEC7E007E21DC /* gCamera.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5ECB089EEC7D007E21DC /* gCamera.cpp */; }; - 8CBA5FB3089EEC7E007E21DC /* gCycle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5ECD089EEC7D007E21DC /* gCycle.cpp */; }; - 8CBA5FB5089EEC7E007E21DC /* gCycleMovement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5ECF089EEC7D007E21DC /* gCycleMovement.cpp */; }; - 8CBA5FB7089EEC7E007E21DC /* gExplosion.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5ED1089EEC7D007E21DC /* gExplosion.cpp */; }; - 8CBA5FB9089EEC7E007E21DC /* gFloor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5ED3089EEC7D007E21DC /* gFloor.cpp */; }; - 8CBA5FBA089EEC7E007E21DC /* gGame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5ED4089EEC7D007E21DC /* gGame.cpp */; }; - 8CBA5FBE089EEC7E007E21DC /* gLanguageMenu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5ED8089EEC7D007E21DC /* gLanguageMenu.cpp */; }; - 8CBA5FC0089EEC7E007E21DC /* gLogo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EDA089EEC7D007E21DC /* gLogo.cpp */; }; - 8CBA5FC2089EEC7E007E21DC /* gMenus.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EDC089EEC7D007E21DC /* gMenus.cpp */; }; - 8CBA5FC4089EEC7E007E21DC /* gParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EDE089EEC7D007E21DC /* gParser.cpp */; }; - 8CBA5FC6089EEC7E007E21DC /* gParticles.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EE0089EEC7D007E21DC /* gParticles.cpp */; }; - 8CBA5FC8089EEC7E007E21DC /* gSensor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EE2089EEC7D007E21DC /* gSensor.cpp */; }; - 8CBA5FCA089EEC7E007E21DC /* gServerBrowser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EE4089EEC7D007E21DC /* gServerBrowser.cpp */; }; - 8CBA5FCC089EEC7E007E21DC /* gServerFavorites.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EE6089EEC7D007E21DC /* gServerFavorites.cpp */; }; - 8CBA5FCE089EEC7E007E21DC /* gSparks.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EE8089EEC7D007E21DC /* gSparks.cpp */; }; - 8CBA5FD0089EEC7E007E21DC /* gSpawn.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EEA089EEC7D007E21DC /* gSpawn.cpp */; }; - 8CBA5FD2089EEC7E007E21DC /* gStuff.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EEC089EEC7D007E21DC /* gStuff.cpp */; }; - 8CBA5FD4089EEC7E007E21DC /* gTeam.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EEE089EEC7D007E21DC /* gTeam.cpp */; }; - 8CBA5FD6089EEC7E007E21DC /* gWall.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EF0089EEC7D007E21DC /* gWall.cpp */; }; - 8CBA5FDB089EEC7E007E21DC /* uInput.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EF6089EEC7D007E21DC /* uInput.cpp */; }; - 8CBA5FDD089EEC7E007E21DC /* uInputQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EF8089EEC7E007E21DC /* uInputQueue.cpp */; }; - 8CBA5FDF089EEC7E007E21DC /* uMenu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CBA5EFA089EEC7E007E21DC /* uMenu.cpp */; }; 8CBA60B1089F00F2007E21DC /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8CBA60B0089F00F2007E21DC /* OpenGL.framework */; }; - 8CBA646208A065A8007E21DC /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 8CBA646108A065A8007E21DC /* Info.plist */; }; - 8CC3F048099D46AD0034B6B8 /* tRecorderInternal.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CC3F046099D46AD0034B6B8 /* tRecorderInternal.cpp */; }; - 8CC3F04C099D46AD0034B6B8 /* tRecorderInternal.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CC3F046099D46AD0034B6B8 /* tRecorderInternal.cpp */; }; 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; - 9B1EA47B0A20B20200FA3478 /* cCockpit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B1EA46F0A20B20200FA3478 /* cCockpit.cpp */; }; - 9B1EA47D0A20B20200FA3478 /* cGauges.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B1EA4710A20B20200FA3478 /* cGauges.cpp */; }; - 9B1EA47F0A20B20200FA3478 /* cLabel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B1EA4730A20B20200FA3478 /* cLabel.cpp */; }; - 9B1EA4810A20B20200FA3478 /* cMap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B1EA4750A20B20200FA3478 /* cMap.cpp */; }; - 9B1EA4830A20B20200FA3478 /* cRectangle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B1EA4770A20B20200FA3478 /* cRectangle.cpp */; }; - 9B1EA4850A20B20200FA3478 /* cWidgetBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B1EA4790A20B20200FA3478 /* cWidgetBase.cpp */; }; - 9B1EA4930A20B20200FA3478 /* cCockpit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B1EA46F0A20B20200FA3478 /* cCockpit.cpp */; }; - 9B1EA4950A20B20200FA3478 /* cGauges.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B1EA4710A20B20200FA3478 /* cGauges.cpp */; }; - 9B1EA4970A20B20200FA3478 /* cLabel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B1EA4730A20B20200FA3478 /* cLabel.cpp */; }; - 9B1EA4990A20B20200FA3478 /* cMap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B1EA4750A20B20200FA3478 /* cMap.cpp */; }; - 9B1EA49B0A20B20200FA3478 /* cRectangle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B1EA4770A20B20200FA3478 /* cRectangle.cpp */; }; - 9B1EA49D0A20B20200FA3478 /* cWidgetBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B1EA4790A20B20200FA3478 /* cWidgetBase.cpp */; }; - 9B1EA5270A20BB0900FA3478 /* rGradient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B1EA5250A20BB0900FA3478 /* rGradient.cpp */; }; - 9B1EA52B0A20BB0900FA3478 /* rGradient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B1EA5250A20BB0900FA3478 /* rGradient.cpp */; }; - 9B1EA53D0A20BC0100FA3478 /* gRotation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B1EA53B0A20BC0100FA3478 /* gRotation.cpp */; }; - 9B1EA5410A20BC0100FA3478 /* gRotation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B1EA53B0A20BC0100FA3478 /* gRotation.cpp */; }; - 9B26D98E0A64AE5400F9864B /* eLagCompensation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B26D98C0A64AE5400F9864B /* eLagCompensation.cpp */; }; - 9B26D9900A64AE5500F9864B /* eLagCompensation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B26D98C0A64AE5400F9864B /* eLagCompensation.cpp */; }; - 9B30C74E0B111D66006D158D /* eEventNotification.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B30C74C0B111D66006D158D /* eEventNotification.cpp */; }; - 9B4A19D20A7A90620070BE82 /* zEffectGroup.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B4A19C20A7A90620070BE82 /* zEffectGroup.cpp */; }; - 9B4A19D40A7A90620070BE82 /* zEffector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B4A19C40A7A90620070BE82 /* zEffector.cpp */; }; - 9B4A19D70A7A90620070BE82 /* zMonitor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B4A19C70A7A90620070BE82 /* zMonitor.cpp */; }; - 9B4A19D90A7A90620070BE82 /* zSelector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B4A19C90A7A90620070BE82 /* zSelector.cpp */; }; - 9B4A19DB0A7A90620070BE82 /* zValidator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B4A19CB0A7A90620070BE82 /* zValidator.cpp */; }; - 9B4A19DD0A7A90620070BE82 /* zZone.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B4A19CD0A7A90620070BE82 /* zZone.cpp */; }; - 9B4A19DF0A7A90620070BE82 /* zZoneInfluence.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B4A19CF0A7A90620070BE82 /* zZoneInfluence.cpp */; }; - 9B4A19E10A7A90620070BE82 /* zEffectGroup.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B4A19C20A7A90620070BE82 /* zEffectGroup.cpp */; }; - 9B4A19E20A7A90620070BE82 /* zEffector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B4A19C40A7A90620070BE82 /* zEffector.cpp */; }; - 9B4A19E30A7A90620070BE82 /* zMonitor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B4A19C70A7A90620070BE82 /* zMonitor.cpp */; }; - 9B4A19E40A7A90620070BE82 /* zSelector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B4A19C90A7A90620070BE82 /* zSelector.cpp */; }; - 9B4A19E50A7A90620070BE82 /* zValidator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B4A19CB0A7A90620070BE82 /* zValidator.cpp */; }; - 9B4A19E60A7A90620070BE82 /* zZone.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B4A19CD0A7A90620070BE82 /* zZone.cpp */; }; - 9B4A19E70A7A90620070BE82 /* zZoneInfluence.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B4A19CF0A7A90620070BE82 /* zZoneInfluence.cpp */; }; - 9B4A1A280A7A95890070BE82 /* mathexpr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B4A1A210A7A95890070BE82 /* mathexpr.cpp */; }; - 9B4A1A2E0A7A95890070BE82 /* mathexpr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B4A1A210A7A95890070BE82 /* mathexpr.cpp */; }; 9B61EBC30B5FEF010018DEA7 /* scripts in Resources */ = {isa = PBXBuildFile; fileRef = 9B61EBBC0B5FEF010018DEA7 /* scripts */; }; 9B83FE950B12161600878E8A /* Growl-WithInstaller.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9B83FE940B12161600878E8A /* Growl-WithInstaller.framework */; }; 9B83FF0F0B121B3100878E8A /* Growl-WithInstaller.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 9B83FE940B12161600878E8A /* Growl-WithInstaller.framework */; }; - 9B83FF410B12248800878E8A /* AAGrowlPlugin.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9B83FF3F0B12248800878E8A /* AAGrowlPlugin.mm */; }; - 9B83FF5E0B1227BD00878E8A /* AAGrowlBridge.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9B83FF5C0B1227BD00878E8A /* AAGrowlBridge.mm */; }; - 9BA6833F0B6BA4B1004FA157 /* libruby1.8-static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9BA6833E0B6BA4B1004FA157 /* libruby1.8-static.a */; }; - 9BA703200B05FAEC00732923 /* tFunction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BA7031E0B05FAEC00732923 /* tFunction.cpp */; }; - 9BAD56D30B57CAA800914844 /* tDecorator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BAD56D10B57CAA800914844 /* tDecorator.cpp */; }; - 9BAF03D90B07A4D100D984EA /* AARuby.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9BAF03D70B07A4D100D984EA /* AARuby.mm */; }; - 9BC0011B0B51859F0041120B /* armagetronad.i in Sources */ = {isa = PBXBuildFile; fileRef = 9BC0F61F0B517AD90041120B /* armagetronad.i */; }; - 9BD56C4A0A8B899700AC1048 /* vCollection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BD56C370A8B899700AC1048 /* vCollection.cpp */; }; - 9BD56C4C0A8B899700AC1048 /* vCore.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BD56C390A8B899700AC1048 /* vCore.cpp */; }; - 9BD56C4F0A8B899700AC1048 /* vebLegacy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BD56C3C0A8B899700AC1048 /* vebLegacy.cpp */; }; - 9BD56C510A8B899700AC1048 /* vebMathExpr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BD56C3E0A8B899700AC1048 /* vebMathExpr.cpp */; }; - 9BD56C530A8B899700AC1048 /* veComparison.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BD56C400A8B899700AC1048 /* veComparison.cpp */; }; - 9BD56C550A8B899700AC1048 /* veLogic.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BD56C420A8B899700AC1048 /* veLogic.cpp */; }; - 9BD56C570A8B899700AC1048 /* veMath.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BD56C440A8B899700AC1048 /* veMath.cpp */; }; - 9BD56C5A0A8B899700AC1048 /* vParser.ypp in Sources */ = {isa = PBXBuildFile; fileRef = 9BD56C470A8B899700AC1048 /* vParser.ypp */; }; - 9BD56C5B0A8B899700AC1048 /* vRegistry.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BD56C480A8B899700AC1048 /* vRegistry.cpp */; }; - 9BD56C5D0A8B899700AC1048 /* vCollection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BD56C370A8B899700AC1048 /* vCollection.cpp */; }; - 9BD56C5E0A8B899700AC1048 /* vCore.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BD56C390A8B899700AC1048 /* vCore.cpp */; }; - 9BD56C5F0A8B899700AC1048 /* vebLegacy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BD56C3C0A8B899700AC1048 /* vebLegacy.cpp */; }; - 9BD56C600A8B899700AC1048 /* vebMathExpr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BD56C3E0A8B899700AC1048 /* vebMathExpr.cpp */; }; - 9BD56C610A8B899700AC1048 /* veComparison.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BD56C400A8B899700AC1048 /* veComparison.cpp */; }; - 9BD56C620A8B899700AC1048 /* veLogic.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BD56C420A8B899700AC1048 /* veLogic.cpp */; }; - 9BD56C630A8B899700AC1048 /* veMath.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BD56C440A8B899700AC1048 /* veMath.cpp */; }; - 9BD56C640A8B899700AC1048 /* vParser.ypp in Sources */ = {isa = PBXBuildFile; fileRef = 9BD56C470A8B899700AC1048 /* vParser.ypp */; }; - 9BD56C650A8B899700AC1048 /* vRegistry.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BD56C480A8B899700AC1048 /* vRegistry.cpp */; }; - 9BD56D270A8B912300AC1048 /* tRuby.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BD56D250A8B912300AC1048 /* tRuby.cpp */; }; + 9BB7B3FF0D8246A2004FE8C3 /* scripts in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9B61EBBC0B5FEF010018DEA7 /* scripts */; }; + 9BB7B4000D8246A2004FE8C3 /* config in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9BD7DAE20A2CAE0700D7033C /* config */; }; + 9BB7B4010D8246A2004FE8C3 /* language in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9BD7DAFE0A2CAE1D00D7033C /* language */; }; + 9BB7B5E10D8302FA004FE8C3 /* eAdvWall.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B5A60D8302FA004FE8C3 /* eAdvWall.cpp */; }; + 9BB7B5E30D8302FA004FE8C3 /* eAuthentication.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B5A80D8302FA004FE8C3 /* eAuthentication.cpp */; }; + 9BB7B5E50D8302FA004FE8C3 /* eAxis.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B5AA0D8302FA004FE8C3 /* eAxis.cpp */; }; + 9BB7B5E70D8302FA004FE8C3 /* eCamera.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B5AC0D8302FA004FE8C3 /* eCamera.cpp */; }; + 9BB7B5EA0D8302FA004FE8C3 /* eDebugLine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B5AF0D8302FA004FE8C3 /* eDebugLine.cpp */; }; + 9BB7B5EC0D8302FA004FE8C3 /* eDisplay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B5B10D8302FA004FE8C3 /* eDisplay.cpp */; }; + 9BB7B5ED0D8302FA004FE8C3 /* eEventNotification.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B5B20D8302FA004FE8C3 /* eEventNotification.cpp */; }; + 9BB7B5EF0D8302FA004FE8C3 /* eFloor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B5B40D8302FA004FE8C3 /* eFloor.cpp */; }; + 9BB7B5F10D8302FA004FE8C3 /* eGameObject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B5B60D8302FA004FE8C3 /* eGameObject.cpp */; }; + 9BB7B5F30D8302FA004FE8C3 /* eGrid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B5B80D8302FA004FE8C3 /* eGrid.cpp */; }; + 9BB7B5F50D8302FA004FE8C3 /* eKrawall.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B5BA0D8302FA004FE8C3 /* eKrawall.cpp */; }; + 9BB7B5F70D8302FA004FE8C3 /* eLagCompensation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B5BC0D8302FA004FE8C3 /* eLagCompensation.cpp */; }; + 9BB7B5F90D8302FA004FE8C3 /* eNetGameObject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B5BE0D8302FA004FE8C3 /* eNetGameObject.cpp */; }; + 9BB7B5FB0D8302FA004FE8C3 /* ePath.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B5C00D8302FA004FE8C3 /* ePath.cpp */; }; + 9BB7B5FD0D8302FA004FE8C3 /* ePlayer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B5C20D8302FA004FE8C3 /* ePlayer.cpp */; }; + 9BB7B5FF0D8302FA004FE8C3 /* eRectangle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B5C40D8302FA004FE8C3 /* eRectangle.cpp */; }; + 9BB7B6010D8302FA004FE8C3 /* eSensor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B5C60D8302FA004FE8C3 /* eSensor.cpp */; }; + 9BB7B6050D8302FA004FE8C3 /* eSoundMixer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B5CA0D8302FA004FE8C3 /* eSoundMixer.cpp */; }; + 9BB7B6070D8302FA004FE8C3 /* eTeam.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B5CC0D8302FA004FE8C3 /* eTeam.cpp */; }; + 9BB7B60A0D8302FA004FE8C3 /* eTimer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B5CF0D8302FA004FE8C3 /* eTimer.cpp */; }; + 9BB7B60C0D8302FA004FE8C3 /* eVoter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B5D10D8302FA004FE8C3 /* eVoter.cpp */; }; + 9BB7B60E0D8302FA004FE8C3 /* eWall.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B5D30D8302FA004FE8C3 /* eWall.cpp */; }; + 9BB7B6110D8302FA004FE8C3 /* eChannelSDLMixer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B5DB0D8302FA004FE8C3 /* eChannelSDLMixer.cpp */; }; + 9BB7B6130D8302FA004FE8C3 /* eMusicTrackSDLMixer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B5DD0D8302FA004FE8C3 /* eMusicTrackSDLMixer.cpp */; }; + 9BB7B6160D8302FA004FE8C3 /* eAdvWall.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B5A60D8302FA004FE8C3 /* eAdvWall.cpp */; }; + 9BB7B6180D8302FA004FE8C3 /* eAuthentication.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B5A80D8302FA004FE8C3 /* eAuthentication.cpp */; }; + 9BB7B61A0D8302FA004FE8C3 /* eAxis.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B5AA0D8302FA004FE8C3 /* eAxis.cpp */; }; + 9BB7B61C0D8302FA004FE8C3 /* eCamera.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B5AC0D8302FA004FE8C3 /* eCamera.cpp */; }; + 9BB7B61F0D8302FA004FE8C3 /* eDebugLine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B5AF0D8302FA004FE8C3 /* eDebugLine.cpp */; }; + 9BB7B6210D8302FA004FE8C3 /* eDisplay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B5B10D8302FA004FE8C3 /* eDisplay.cpp */; }; + 9BB7B6220D8302FA004FE8C3 /* eEventNotification.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B5B20D8302FA004FE8C3 /* eEventNotification.cpp */; }; + 9BB7B6240D8302FA004FE8C3 /* eFloor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B5B40D8302FA004FE8C3 /* eFloor.cpp */; }; + 9BB7B6260D8302FA004FE8C3 /* eGameObject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B5B60D8302FA004FE8C3 /* eGameObject.cpp */; }; + 9BB7B6280D8302FA004FE8C3 /* eGrid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B5B80D8302FA004FE8C3 /* eGrid.cpp */; }; + 9BB7B62A0D8302FA004FE8C3 /* eKrawall.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B5BA0D8302FA004FE8C3 /* eKrawall.cpp */; }; + 9BB7B62C0D8302FA004FE8C3 /* eLagCompensation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B5BC0D8302FA004FE8C3 /* eLagCompensation.cpp */; }; + 9BB7B62E0D8302FA004FE8C3 /* eNetGameObject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B5BE0D8302FA004FE8C3 /* eNetGameObject.cpp */; }; + 9BB7B6300D8302FA004FE8C3 /* ePath.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B5C00D8302FA004FE8C3 /* ePath.cpp */; }; + 9BB7B6320D8302FA004FE8C3 /* ePlayer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B5C20D8302FA004FE8C3 /* ePlayer.cpp */; }; + 9BB7B6340D8302FA004FE8C3 /* eRectangle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B5C40D8302FA004FE8C3 /* eRectangle.cpp */; }; + 9BB7B6360D8302FB004FE8C3 /* eSensor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B5C60D8302FA004FE8C3 /* eSensor.cpp */; }; + 9BB7B63A0D8302FB004FE8C3 /* eSoundMixer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B5CA0D8302FA004FE8C3 /* eSoundMixer.cpp */; }; + 9BB7B63C0D8302FB004FE8C3 /* eTeam.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B5CC0D8302FA004FE8C3 /* eTeam.cpp */; }; + 9BB7B63F0D8302FB004FE8C3 /* eTimer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B5CF0D8302FA004FE8C3 /* eTimer.cpp */; }; + 9BB7B6410D8302FB004FE8C3 /* eVoter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B5D10D8302FA004FE8C3 /* eVoter.cpp */; }; + 9BB7B6430D8302FB004FE8C3 /* eWall.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B5D30D8302FA004FE8C3 /* eWall.cpp */; }; + 9BB7B6460D8302FB004FE8C3 /* eChannelSDLMixer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B5DB0D8302FA004FE8C3 /* eChannelSDLMixer.cpp */; }; + 9BB7B6480D8302FB004FE8C3 /* eMusicTrackSDLMixer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B5DD0D8302FA004FE8C3 /* eMusicTrackSDLMixer.cpp */; }; + 9BB7B6630D830322004FE8C3 /* AAGrowlBridge.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B64E0D830321004FE8C3 /* AAGrowlBridge.mm */; }; + 9BB7B6650D830322004FE8C3 /* AAGrowlPlugin.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B6500D830321004FE8C3 /* AAGrowlPlugin.mm */; }; + 9BB7B6670D830322004FE8C3 /* AARuby.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B6520D830321004FE8C3 /* AARuby.mm */; }; + 9BB7B6690D830322004FE8C3 /* AAURLHandler.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B6540D830321004FE8C3 /* AAURLHandler.mm */; }; + 9BB7B66F0D830322004FE8C3 /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 9BB7B65D0D830321004FE8C3 /* Info.plist */; }; + 9BB7B6710D830322004FE8C3 /* SDLMain.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B65F0D830321004FE8C3 /* SDLMain.mm */; }; + 9BB7B6730D830322004FE8C3 /* version.h.in in Resources */ = {isa = PBXBuildFile; fileRef = 9BB7B6610D830322004FE8C3 /* version.h.in */; }; + 9BB7B6890D830352004FE8C3 /* InfoPlist.strings.in in Resources */ = {isa = PBXBuildFile; fileRef = 9BB7B6870D830352004FE8C3 /* InfoPlist.strings.in */; }; + 9BB7B6AF0D830366004FE8C3 /* md5.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B6900D830365004FE8C3 /* md5.cpp */; }; + 9BB7B6B10D830366004FE8C3 /* nAuthentication.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B6920D830365004FE8C3 /* nAuthentication.cpp */; }; + 9BB7B6B30D830366004FE8C3 /* nConfig.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B6940D830365004FE8C3 /* nConfig.cpp */; }; + 9BB7B6B70D830366004FE8C3 /* nKrawall.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B6980D830365004FE8C3 /* nKrawall.cpp */; }; + 9BB7B6B90D830366004FE8C3 /* nKrawallPrivate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B69A0D830365004FE8C3 /* nKrawallPrivate.cpp */; }; + 9BB7B6BA0D830366004FE8C3 /* nNetObject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B69B0D830365004FE8C3 /* nNetObject.cpp */; }; + 9BB7B6BC0D830366004FE8C3 /* nNetwork.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B69D0D830365004FE8C3 /* nNetwork.cpp */; }; + 9BB7B6BE0D830366004FE8C3 /* nObserver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B69F0D830365004FE8C3 /* nObserver.cpp */; }; + 9BB7B6C00D830366004FE8C3 /* nPriorizing.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B6A10D830365004FE8C3 /* nPriorizing.cpp */; }; + 9BB7B6C20D830366004FE8C3 /* nServerInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B6A30D830365004FE8C3 /* nServerInfo.cpp */; }; + 9BB7B6C50D830366004FE8C3 /* nSocket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B6A60D830365004FE8C3 /* nSocket.cpp */; }; + 9BB7B6C70D830366004FE8C3 /* nSpamProtection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B6A80D830366004FE8C3 /* nSpamProtection.cpp */; }; + 9BB7B6CD0D830366004FE8C3 /* md5.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B6900D830365004FE8C3 /* md5.cpp */; }; + 9BB7B6CF0D830366004FE8C3 /* nAuthentication.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B6920D830365004FE8C3 /* nAuthentication.cpp */; }; + 9BB7B6D10D830366004FE8C3 /* nConfig.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B6940D830365004FE8C3 /* nConfig.cpp */; }; + 9BB7B6D50D830366004FE8C3 /* nKrawall.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B6980D830365004FE8C3 /* nKrawall.cpp */; }; + 9BB7B6D70D830366004FE8C3 /* nKrawallPrivate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B69A0D830365004FE8C3 /* nKrawallPrivate.cpp */; }; + 9BB7B6D80D830366004FE8C3 /* nNetObject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B69B0D830365004FE8C3 /* nNetObject.cpp */; }; + 9BB7B6DA0D830366004FE8C3 /* nNetwork.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B69D0D830365004FE8C3 /* nNetwork.cpp */; }; + 9BB7B6DC0D830366004FE8C3 /* nObserver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B69F0D830365004FE8C3 /* nObserver.cpp */; }; + 9BB7B6DE0D830366004FE8C3 /* nPriorizing.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B6A10D830365004FE8C3 /* nPriorizing.cpp */; }; + 9BB7B6E00D830366004FE8C3 /* nServerInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B6A30D830365004FE8C3 /* nServerInfo.cpp */; }; + 9BB7B6E30D830366004FE8C3 /* nSocket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B6A60D830365004FE8C3 /* nSocket.cpp */; }; + 9BB7B6E50D830366004FE8C3 /* nSpamProtection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B6A80D830366004FE8C3 /* nSpamProtection.cpp */; }; + 9BB7B70F0D830391004FE8C3 /* rConsole.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B6ED0D830390004FE8C3 /* rConsole.cpp */; }; + 9BB7B7120D830391004FE8C3 /* rConsoleGraph.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B6F00D830390004FE8C3 /* rConsoleGraph.cpp */; }; + 9BB7B7130D830391004FE8C3 /* rDisplayList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B6F10D830390004FE8C3 /* rDisplayList.cpp */; }; + 9BB7B7150D830391004FE8C3 /* rFont.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B6F30D830390004FE8C3 /* rFont.cpp */; }; + 9BB7B7170D830391004FE8C3 /* rGL.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B6F50D830391004FE8C3 /* rGL.cpp */; }; + 9BB7B71A0D830391004FE8C3 /* rGLRender.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B6F80D830391004FE8C3 /* rGLRender.cpp */; }; + 9BB7B71B0D830391004FE8C3 /* rGLuintObject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B6F90D830391004FE8C3 /* rGLuintObject.cpp */; }; + 9BB7B71D0D830391004FE8C3 /* rGradient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B6FB0D830391004FE8C3 /* rGradient.cpp */; }; + 9BB7B71F0D830391004FE8C3 /* rModel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B6FD0D830391004FE8C3 /* rModel.cpp */; }; + 9BB7B7210D830391004FE8C3 /* rRender.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B6FF0D830391004FE8C3 /* rRender.cpp */; }; + 9BB7B7230D830391004FE8C3 /* rScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B7010D830391004FE8C3 /* rScreen.cpp */; }; + 9BB7B7260D830391004FE8C3 /* rSysdep.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B7040D830391004FE8C3 /* rSysdep.cpp */; }; + 9BB7B7280D830391004FE8C3 /* rTexture.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B7060D830391004FE8C3 /* rTexture.cpp */; }; + 9BB7B72A0D830391004FE8C3 /* rTextureRenderTarget.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B7080D830391004FE8C3 /* rTextureRenderTarget.cpp */; }; + 9BB7B72C0D830391004FE8C3 /* rViewport.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B70A0D830391004FE8C3 /* rViewport.cpp */; }; + 9BB7B7300D830391004FE8C3 /* rConsole.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B6ED0D830390004FE8C3 /* rConsole.cpp */; }; + 9BB7B7330D830391004FE8C3 /* rConsoleGraph.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B6F00D830390004FE8C3 /* rConsoleGraph.cpp */; }; + 9BB7B7340D830391004FE8C3 /* rDisplayList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B6F10D830390004FE8C3 /* rDisplayList.cpp */; }; + 9BB7B7360D830391004FE8C3 /* rFont.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B6F30D830390004FE8C3 /* rFont.cpp */; }; + 9BB7B7380D830391004FE8C3 /* rGL.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B6F50D830391004FE8C3 /* rGL.cpp */; }; + 9BB7B73B0D830391004FE8C3 /* rGLRender.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B6F80D830391004FE8C3 /* rGLRender.cpp */; }; + 9BB7B73C0D830391004FE8C3 /* rGLuintObject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B6F90D830391004FE8C3 /* rGLuintObject.cpp */; }; + 9BB7B73E0D830391004FE8C3 /* rGradient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B6FB0D830391004FE8C3 /* rGradient.cpp */; }; + 9BB7B7400D830391004FE8C3 /* rModel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B6FD0D830391004FE8C3 /* rModel.cpp */; }; + 9BB7B7420D830391004FE8C3 /* rRender.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B6FF0D830391004FE8C3 /* rRender.cpp */; }; + 9BB7B7440D830391004FE8C3 /* rScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B7010D830391004FE8C3 /* rScreen.cpp */; }; + 9BB7B7470D830391004FE8C3 /* rSysdep.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B7040D830391004FE8C3 /* rSysdep.cpp */; }; + 9BB7B7490D830391004FE8C3 /* rTexture.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B7060D830391004FE8C3 /* rTexture.cpp */; }; + 9BB7B74B0D830391004FE8C3 /* rTextureRenderTarget.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B7080D830391004FE8C3 /* rTextureRenderTarget.cpp */; }; + 9BB7B74D0D830391004FE8C3 /* rViewport.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B70A0D830391004FE8C3 /* rViewport.cpp */; }; + 9BB7B7780D8303BB004FE8C3 /* mathexpr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B75B0D8303BA004FE8C3 /* mathexpr.cpp */; }; + 9BB7B78F0D8303BB004FE8C3 /* mathexpr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B75B0D8303BA004FE8C3 /* mathexpr.cpp */; }; + 9BB7B8100D830423004FE8C3 /* tArray.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B7A30D830422004FE8C3 /* tArray.cpp */; }; + 9BB7B8120D830423004FE8C3 /* tCallback.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B7A50D830422004FE8C3 /* tCallback.cpp */; }; + 9BB7B8160D830423004FE8C3 /* tCommandLine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B7A90D830422004FE8C3 /* tCommandLine.cpp */; }; + 9BB7B8180D830423004FE8C3 /* tConfiguration.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B7AB0D830422004FE8C3 /* tConfiguration.cpp */; }; + 9BB7B81A0D830423004FE8C3 /* tConsole.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B7AD0D830422004FE8C3 /* tConsole.cpp */; }; + 9BB7B81D0D830423004FE8C3 /* tCrypt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B7B00D830422004FE8C3 /* tCrypt.cpp */; }; + 9BB7B81F0D830423004FE8C3 /* tDecorator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B7B20D830422004FE8C3 /* tDecorator.cpp */; }; + 9BB7B8210D830423004FE8C3 /* tDirectories.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B7B40D830422004FE8C3 /* tDirectories.cpp */; }; + 9BB7B8230D830423004FE8C3 /* tError.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B7B60D830422004FE8C3 /* tError.cpp */; }; + 9BB7B8250D830423004FE8C3 /* tEventQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B7B80D830422004FE8C3 /* tEventQueue.cpp */; }; + 9BB7B8270D830423004FE8C3 /* tException.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B7BA0D830422004FE8C3 /* tException.cpp */; }; + 9BB7B8290D830423004FE8C3 /* tFunction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B7BC0D830422004FE8C3 /* tFunction.cpp */; }; + 9BB7B82B0D830423004FE8C3 /* tHeap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B7BE0D830422004FE8C3 /* tHeap.cpp */; }; + 9BB7B82D0D830423004FE8C3 /* tIniFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B7C00D830422004FE8C3 /* tIniFile.cpp */; }; + 9BB7B8300D830423004FE8C3 /* tLinkedList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B7C30D830422004FE8C3 /* tLinkedList.cpp */; }; + 9BB7B8330D830423004FE8C3 /* tLocale.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B7C60D830422004FE8C3 /* tLocale.cpp */; }; + 9BB7B8360D830423004FE8C3 /* tMemManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B7C90D830422004FE8C3 /* tMemManager.cpp */; }; + 9BB7B8380D830423004FE8C3 /* tMemStack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B7CB0D830422004FE8C3 /* tMemStack.cpp */; }; + 9BB7B83A0D830423004FE8C3 /* tPlayList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B7CD0D830422004FE8C3 /* tPlayList.cpp */; }; + 9BB7B83F0D830423004FE8C3 /* tRandom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B7D20D830422004FE8C3 /* tRandom.cpp */; }; + 9BB7B8420D830423004FE8C3 /* tRecorder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B7D50D830422004FE8C3 /* tRecorder.cpp */; }; + 9BB7B8440D830423004FE8C3 /* tRecorderInternal.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B7D70D830422004FE8C3 /* tRecorderInternal.cpp */; }; + 9BB7B8470D830423004FE8C3 /* tResource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B7DA0D830422004FE8C3 /* tResource.cpp */; }; + 9BB7B8490D830423004FE8C3 /* tResourceManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B7DC0D830422004FE8C3 /* tResourceManager.cpp */; }; + 9BB7B84B0D830423004FE8C3 /* tRing.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B7DE0D830422004FE8C3 /* tRing.cpp */; }; + 9BB7B84D0D830423004FE8C3 /* tRuby.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B7E00D830422004FE8C3 /* tRuby.cpp */; }; + 9BB7B84F0D830423004FE8C3 /* tSafePTR.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B7E20D830422004FE8C3 /* tSafePTR.cpp */; }; + 9BB7B8520D830423004FE8C3 /* tStatEntry.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B7E50D830422004FE8C3 /* tStatEntry.cpp */; }; + 9BB7B8540D830423004FE8C3 /* tStatFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B7E70D830422004FE8C3 /* tStatFile.cpp */; }; + 9BB7B8560D830423004FE8C3 /* tString.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B7E90D830422004FE8C3 /* tString.cpp */; }; + 9BB7B8580D830423004FE8C3 /* tSysTime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B7EB0D830422004FE8C3 /* tSysTime.cpp */; }; + 9BB7B85A0D830423004FE8C3 /* tToDo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B7ED0D830422004FE8C3 /* tToDo.cpp */; }; + 9BB7B85E0D830423004FE8C3 /* tXmlParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BB7B7F10D830422004FE8C3 /* tXmlParser.cpp */; }... [truncated message content] |