00001 00002 00003 00004 00005 00006 00007 00008 00009 00010 00011 00012 00014 00015 #include "aiWorld.h" 00016 #include "aiCharacter.h" 00017 00018 AIWorld::AIWorld(NodePath render) { 00019 _ai_char_pool = new AICharPool(); 00020 _render = render; 00021 } 00022 00023 AIWorld::~AIWorld() { 00024 } 00025 00026 void AIWorld::add_ai_char(AICharacter *ai_char) { 00027 _ai_char_pool->append(ai_char); 00028 ai_char->_window_render = _render; 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 00093 Flock AIWorld::get_flock(unsigned int flock_id) { 00094 for(unsigned int i=0; i < _flock_pool.size(); i++) { 00095 if(_flock_pool[i]->get_id() == flock_id) { 00096 return *_flock_pool[i]; 00097 } 00098 } 00099 } 00100 00105 00107 00108 void AIWorld::remove_flock(unsigned int flock_id) { 00109 for(unsigned int i = 0; i < _flock_pool.size(); ++i) { 00110 if(_flock_pool[i]->get_id() == flock_id) { 00111 for(unsigned int j = 0; j < _flock_pool[i]->_ai_char_list.size(); j++) { 00112 _flock_pool[i]->_ai_char_list[j]->get_ai_behaviors()->flock_activate_off(); 00113 _flock_pool[i]->_ai_char_list[j]->get_ai_behaviors()->flock_off(); 00114 _flock_pool[i]->_ai_char_list[j]->get_ai_behaviors()->_flock_group = NULL; 00115 } 00116 _flock_pool.erase(_flock_pool.begin() + i); 00117 break; 00118 } 00119 } 00120 } 00121 00127 00129 00130 void AIWorld::flock_off(unsigned int flock_id) { 00131 for(unsigned int i = 0; i < _flock_pool.size(); ++i) { 00132 if(_flock_pool[i]->get_id() == flock_id) { 00133 for(unsigned int j = 0; j < _flock_pool[i]->_ai_char_list.size(); j++) { 00134 _flock_pool[i]->_ai_char_list[j]->get_ai_behaviors()->flock_activate_off(); 00135 _flock_pool[i]->_ai_char_list[j]->get_ai_behaviors()->flock_off(); 00136 } 00137 break; 00138 } 00139 } 00140 } 00141 00146 00148 00149 void AIWorld::flock_on(unsigned int flock_id) { 00150 for(unsigned int i = 0; i < _flock_pool.size(); ++i) { 00151 if(_flock_pool[i]->get_id() == flock_id) { 00152 for(unsigned int j = 0; j < _flock_pool[i]->_ai_char_list.size(); j++) { 00153 _flock_pool[i]->_ai_char_list[j]->get_ai_behaviors()->flock_activate_on(); 00154 } 00155 break; 00156 } 00157 } 00158 } 00159 00160 AICharPool::AICharPool() { 00161 _head = NULL; 00162 } 00163 00164 AICharPool::~AICharPool() { 00165 } 00166 00167 void AICharPool::append(AICharacter *ai_ch) { 00168 node *q; 00169 node *t; 00170 00171 if(_head == NULL) { 00172 q = new node(); 00173 q->_ai_char = ai_ch; 00174 q->_next = NULL; 00175 _head = q; 00176 } 00177 else { 00178 q = _head; 00179 while( q->_next != NULL) { 00180 q = q->_next; 00181 } 00182 00183 t = new node(); 00184 t->_ai_char = ai_ch; 00185 t->_next = NULL; 00186 q->_next = t; 00187 } 00188 } 00189 00190 void AICharPool::del(string name) { 00191 node *q; 00192 node *r; 00193 q = _head; 00194 00195 if(_head==NULL) { 00196 return; 00197 } 00198 00200 if(q->_next == NULL) { 00201 if(q->_ai_char->_name == name) { 00202 _head = NULL; 00203 delete q; 00204 } 00205 return; 00206 } 00207 00208 r = q; 00209 while( q != NULL) { 00210 if( q->_ai_char->_name == name) { 00212 if(q == _head) { 00213 _head = q->_next; 00214 delete q; 00215 return; 00216 } 00217 00218 r->_next = q->_next; 00219 delete q; 00220 return; 00221 } 00222 r = q; 00223 q = q->_next; 00224 } 00225 } 00226 00232 00234 00235 void AICharPool::print_list() { 00236 node* q; 00237 q = _head; 00238 while(q != NULL) { 00239 cout<<q->_ai_char->_name<<endl; 00240 q = q->_next; 00241 } 00242 }