00001 00002 00003 00004 00005 00006 00007 00008 00009 00010 00011 00012 00014 00015 #include "aiWorld.h" 00016 00017 AIWorld::AIWorld(NodePath render) { 00018 _ai_char_pool = new AICharPool(); 00019 _render = render; 00020 } 00021 00022 AIWorld::~AIWorld() { 00023 } 00024 00025 void AIWorld::add_ai_char(AICharacter *ai_char) { 00026 _ai_char_pool->append(ai_char); 00027 ai_char->_window_render = _render; 00028 ai_char->_world = this; 00029 } 00030 00031 void AIWorld::remove_ai_char(string name) { 00032 _ai_char_pool->del(name); 00033 remove_ai_char_from_flock(name); 00034 } 00035 00036 void AIWorld::remove_ai_char_from_flock(string name) { 00037 AICharPool::node *ai_pool; 00038 ai_pool = _ai_char_pool->_head; 00039 while((ai_pool) != NULL) { 00040 for(unsigned int i = 0; i < _flock_pool.size(); ++i) { 00041 if(ai_pool->_ai_char->_ai_char_flock_id == _flock_pool[i]->get_id()) { 00042 for(unsigned int j = 0; j<_flock_pool[i]->_ai_char_list.size(); ++j) { 00043 if(_flock_pool[i]->_ai_char_list[j]->_name == name) { 00044 _flock_pool[i]->_ai_char_list.erase(_flock_pool[i]->_ai_char_list.begin() + j); 00045 return; 00046 } 00047 } 00048 } 00049 } 00050 ai_pool = ai_pool->_next; 00051 } 00052 } 00053 00054 void AIWorld::print_list() { 00055 _ai_char_pool->print_list(); 00056 } 00057 00062 00064 00065 void AIWorld::update() { 00066 AICharPool::node *ai_pool; 00067 ai_pool = _ai_char_pool->_head; 00068 00069 while((ai_pool)!=NULL) { 00070 ai_pool->_ai_char->update(); 00071 ai_pool = ai_pool->_next; 00072 } 00073 } 00074 00081 00083 00084 void AIWorld::add_flock(Flock *flock) { 00085 // Add all the ai_characters in the flock to the AIWorld. 00086 for(unsigned int i = 0; i < flock->_ai_char_list.size(); ++i) { 00087 this->add_ai_char(flock->_ai_char_list[i]); 00088 } 00089 // Add the flock to the flock pool. 00090 _flock_pool.push_back(flock); 00091 } 00092 00097 00099 00100 Flock AIWorld::get_flock(unsigned int flock_id) { 00101 for(unsigned int i=0; i < _flock_pool.size(); ++i) { 00102 if(_flock_pool[i]->get_id() == flock_id) { 00103 return *_flock_pool[i]; 00104 } 00105 } 00106 Flock *null_flock = NULL; 00107 return *null_flock; 00108 } 00109 00114 00116 00117 void AIWorld::remove_flock(unsigned int flock_id) { 00118 for(unsigned int i = 0; i < _flock_pool.size(); ++i) { 00119 if(_flock_pool[i]->get_id() == flock_id) { 00120 for(unsigned int j = 0; j < _flock_pool[i]->_ai_char_list.size(); ++j) { 00121 _flock_pool[i]->_ai_char_list[j]->get_ai_behaviors()->turn_off("flock_activate"); 00122 _flock_pool[i]->_ai_char_list[j]->get_ai_behaviors()->turn_off("flock"); 00123 _flock_pool[i]->_ai_char_list[j]->get_ai_behaviors()->_flock_group = NULL; 00124 } 00125 _flock_pool.erase(_flock_pool.begin() + i); 00126 break; 00127 } 00128 } 00129 } 00130 00136 00138 00139 void AIWorld::flock_off(unsigned int flock_id) { 00140 for(unsigned int i = 0; i < _flock_pool.size(); ++i) { 00141 if(_flock_pool[i]->get_id() == flock_id) { 00142 for(unsigned int j = 0; j < _flock_pool[i]->_ai_char_list.size(); ++j) { 00143 _flock_pool[i]->_ai_char_list[j]->get_ai_behaviors()->turn_off("flock_activate"); 00144 _flock_pool[i]->_ai_char_list[j]->get_ai_behaviors()->turn_off("flock"); 00145 } 00146 break; 00147 } 00148 } 00149 } 00150 00155 00157 00158 void AIWorld::flock_on(unsigned int flock_id) { 00159 for(unsigned int i = 0; i < _flock_pool.size(); ++i) { 00160 if(_flock_pool[i]->get_id() == flock_id) { 00161 for(unsigned int j = 0; j < _flock_pool[i]->_ai_char_list.size(); ++j) { 00162 _flock_pool[i]->_ai_char_list[j]->get_ai_behaviors()->turn_on("flock_activate"); 00163 } 00164 break; 00165 } 00166 } 00167 } 00168 00169 AICharPool::AICharPool() { 00170 _head = NULL; 00171 } 00172 00173 AICharPool::~AICharPool() { 00174 } 00175 00176 void AICharPool::append(AICharacter *ai_ch) { 00177 node *q; 00178 node *t; 00179 00180 if(_head == NULL) { 00181 q = new node(); 00182 q->_ai_char = ai_ch; 00183 q->_next = NULL; 00184 _head = q; 00185 } 00186 else { 00187 q = _head; 00188 while( q->_next != NULL) { 00189 q = q->_next; 00190 } 00191 00192 t = new node(); 00193 t->_ai_char = ai_ch; 00194 t->_next = NULL; 00195 q->_next = t; 00196 } 00197 } 00198 00199 void AICharPool::del(string name) { 00200 node *q; 00201 node *r; 00202 q = _head; 00203 00204 if(_head==NULL) { 00205 return; 00206 } 00207 00208 // Only one node in the linked list 00209 if(q->_next == NULL) { 00210 if(q->_ai_char->_name == name) { 00211 _head = NULL; 00212 delete q; 00213 } 00214 return; 00215 } 00216 00217 r = q; 00218 while( q != NULL) { 00219 if( q->_ai_char->_name == name) { 00220 // Special case 00221 if(q == _head) { 00222 _head = q->_next; 00223 delete q; 00224 return; 00225 } 00226 00227 r->_next = q->_next; 00228 delete q; 00229 return; 00230 } 00231 r = q; 00232 q = q->_next; 00233 } 00234 } 00235 00241 00243 00244 void AICharPool::print_list() { 00245 node* q; 00246 q = _head; 00247 while(q != NULL) { 00248 cout<<q->_ai_char->_name<<endl; 00249 q = q->_next; 00250 } 00251 } 00252 00258 00260 00261 void AIWorld::add_obstacle(NodePath obstacle) { 00262 _obstacles.push_back(obstacle); 00263 } 00264 00270 00272 00273 void AIWorld::remove_obstacle(NodePath obstacle) { 00274 for(unsigned int i = 0; i <= _obstacles.size(); ++i) { 00275 if(_obstacles[i] == obstacle) { 00276 _obstacles.erase(_obstacles.begin() + i); 00277 } 00278 } 00279 }