00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include "tMemManager.h"
00029
00030 #include "nConfig.h"
00031
00032 #include "eGrid.h"
00033 #include "gArena.h"
00034 #include "gSpawn.h"
00035 #include "gWall.h"
00036 #include "gParser.h"
00037 #include "tRandom.h"
00038 #include "eRectangle.h"
00039
00040 static float sizeMultiplier = .5f;
00041 static nSettingItem<float> conf_mult ("REAL_ARENA_SIZE_FACTOR", sizeMultiplier);
00042
00043 static int axes = 4;
00044 static nSettingItemWatched<int> conf_axes ("ARENA_AXES", axes, nConfItemVersionWatcher::Group_Breaking, 6 );
00045
00046 gArena::gArena():spawnPoints()
00047 {
00048 }
00049
00050 void gArena::NewSpawnPoint(const eCoord &loc,const eCoord &dir){
00051 gSpawnPoint *s=tNEW(gSpawnPoint) (loc,dir);
00052 spawnPoints.Add(s,s->id);
00053 }
00054
00055
00056 void gArena::RemoveAllSpawn() {
00057 while (spawnPoints.Len()){
00058 gSpawnPoint *s=spawnPoints(0);
00059 spawnPoints.Remove(s,s->id);
00060 delete s;
00061 }
00062 }
00063
00064 gArena::~gArena()
00065 {
00066
00067
00068
00069
00070
00071 while (spawnPoints.Len())
00072 {
00073 gSpawnPoint *s=spawnPoints(0);
00074 spawnPoints.Remove(s,s->id);
00075 delete s;
00076 }
00077 }
00078
00079 bool init_grid_in_process;
00080
00081
00082 void exit_game_objects(eGrid *grid);
00083
00084 eCoord gArena::GetRandomPos(REAL factor) const
00085 {
00086 tRandomizer & randomizer = tReproducibleRandomizer::GetInstance();
00087 REAL x = randomizer.Get();
00088 REAL y = randomizer.Get();
00089
00090
00091
00092
00093 return eWallRim::GetBounds().GetPoint( eCoord( x * factor + .5f * ( 1 - factor ), y * factor + .5f * ( 1 - factor ) ) );
00094 }
00095
00096 void gArena::PrepareGrid(eGrid *grid, gParser *aParser)
00097 {
00098 RemoveAllSpawn();
00099
00100 init_grid_in_process=true;
00101 grid->Create();
00102 grid->SetWinding(axes);
00103
00104 aParser->setSizeMultiplier(sizeMultiplier);
00105 aParser->Parse();
00106
00107 init_grid_in_process=false;
00108
00109 int i;
00110 for(i=0;i<spawnPoints.Len();i++)
00111 spawnPoints(i)->Clear();
00112
00113
00114 eWallRim::UpdateBounds();
00115 }
00116
00117
00118 gSpawnPoint * gArena::LeastDangerousSpawnPoint()
00119 {
00120 REAL mindanger=1E+30;
00121 gSpawnPoint *ret=NULL;
00122
00123 for(int i=0;i<spawnPoints.Len();i++)
00124 {
00125 REAL newDanger = spawnPoints(i)->Danger();
00126 if (newDanger < mindanger - EPS )
00127 {
00128 ret = spawnPoints(i);
00129 mindanger = newDanger;
00130 }
00131 }
00132
00133 if (!ret)
00134 tERR_ERROR("No spawnpoint available!");
00135
00136 #ifdef DEBUG
00137
00138 #endif
00139
00140 return ret;
00141 }
00142
00143 float gArena::SizeMultiplier()
00144 {
00145 return sizeMultiplier;
00146 }
00147
00148 void gArena::SetSizeMultiplier(float mult)
00149 {
00150 conf_mult.Set( mult );
00151 }
00152
00153 float gArena::GetSizeMultiplier()
00154 {
00155 return sizeMultiplier;
00156 }