00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include "aiWorld.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 ai_char->_world = this;
00030 }
00031
00032 void AIWorld::remove_ai_char(string name) {
00033 _ai_char_pool->del(name);
00034 remove_ai_char_from_flock(name);
00035 }
00036
00037 void AIWorld::remove_ai_char_from_flock(string name) {
00038 AICharPool::node *ai_pool;
00039 ai_pool = _ai_char_pool->_head;
00040 while((ai_pool) != NULL) {
00041 for(unsigned int i = 0; i < _flock_pool.size(); ++i) {
00042 if(ai_pool->_ai_char->_ai_char_flock_id == _flock_pool[i]->get_id()) {
00043 for(unsigned int j = 0; j<_flock_pool[i]->_ai_char_list.size(); ++j) {
00044 if(_flock_pool[i]->_ai_char_list[j]->_name == name) {
00045 _flock_pool[i]->_ai_char_list.erase(_flock_pool[i]->_ai_char_list.begin() + j);
00046 return;
00047 }
00048 }
00049 }
00050 }
00051 ai_pool = ai_pool->_next;
00052 }
00053 }
00054
00055 void AIWorld::print_list() {
00056 _ai_char_pool->print_list();
00057 }
00058
00059
00060
00061
00062
00063
00064
00065
00066 void AIWorld::update() {
00067 AICharPool::node *ai_pool;
00068 ai_pool = _ai_char_pool->_head;
00069
00070 while((ai_pool)!=NULL) {
00071 ai_pool->_ai_char->update();
00072 ai_pool = ai_pool->_next;
00073 }
00074 }
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085 void AIWorld::add_flock(Flock *flock) {
00086
00087 for(unsigned int i = 0; i < flock->_ai_char_list.size(); ++i) {
00088 this->add_ai_char(flock->_ai_char_list[i]);
00089 }
00090
00091 _flock_pool.push_back(flock);
00092 }
00093
00094
00095
00096
00097
00098
00099
00100
00101 Flock AIWorld::get_flock(unsigned int flock_id) {
00102 for(unsigned int i=0; i < _flock_pool.size(); ++i) {
00103 if(_flock_pool[i]->get_id() == flock_id) {
00104 return *_flock_pool[i];
00105 }
00106 }
00107 Flock *null_flock = NULL;
00108 return *null_flock;
00109 }
00110
00111
00112
00113
00114
00115
00116
00117
00118 void AIWorld::remove_flock(unsigned int flock_id) {
00119 for(unsigned int i = 0; i < _flock_pool.size(); ++i) {
00120 if(_flock_pool[i]->get_id() == flock_id) {
00121 for(unsigned int j = 0; j < _flock_pool[i]->_ai_char_list.size(); ++j) {
00122 _flock_pool[i]->_ai_char_list[j]->get_ai_behaviors()->turn_off("flock_activate");
00123 _flock_pool[i]->_ai_char_list[j]->get_ai_behaviors()->turn_off("flock");
00124 _flock_pool[i]->_ai_char_list[j]->get_ai_behaviors()->_flock_group = NULL;
00125 }
00126 _flock_pool.erase(_flock_pool.begin() + i);
00127 break;
00128 }
00129 }
00130 }
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140 void AIWorld::flock_off(unsigned int flock_id) {
00141 for(unsigned int i = 0; i < _flock_pool.size(); ++i) {
00142 if(_flock_pool[i]->get_id() == flock_id) {
00143 for(unsigned int j = 0; j < _flock_pool[i]->_ai_char_list.size(); ++j) {
00144 _flock_pool[i]->_ai_char_list[j]->get_ai_behaviors()->turn_off("flock_activate");
00145 _flock_pool[i]->_ai_char_list[j]->get_ai_behaviors()->turn_off("flock");
00146 }
00147 break;
00148 }
00149 }
00150 }
00151
00152
00153
00154
00155
00156
00157
00158
00159 void AIWorld::flock_on(unsigned int flock_id) {
00160 for(unsigned int i = 0; i < _flock_pool.size(); ++i) {
00161 if(_flock_pool[i]->get_id() == flock_id) {
00162 for(unsigned int j = 0; j < _flock_pool[i]->_ai_char_list.size(); ++j) {
00163 _flock_pool[i]->_ai_char_list[j]->get_ai_behaviors()->turn_on("flock_activate");
00164 }
00165 break;
00166 }
00167 }
00168 }
00169
00170 AICharPool::AICharPool() {
00171 _head = NULL;
00172 }
00173
00174 AICharPool::~AICharPool() {
00175 }
00176
00177 void AICharPool::append(AICharacter *ai_ch) {
00178 node *q;
00179 node *t;
00180
00181 if(_head == NULL) {
00182 q = new node();
00183 q->_ai_char = ai_ch;
00184 q->_next = NULL;
00185 _head = q;
00186 }
00187 else {
00188 q = _head;
00189 while( q->_next != NULL) {
00190 q = q->_next;
00191 }
00192
00193 t = new node();
00194 t->_ai_char = ai_ch;
00195 t->_next = NULL;
00196 q->_next = t;
00197 }
00198 }
00199
00200 void AICharPool::del(string name) {
00201 node *q;
00202 node *r;
00203 q = _head;
00204
00205 if(_head==NULL) {
00206 return;
00207 }
00208
00209
00210 if(q->_next == NULL) {
00211 if(q->_ai_char->_name == name) {
00212 _head = NULL;
00213 delete q;
00214 }
00215 return;
00216 }
00217
00218 r = q;
00219 while( q != NULL) {
00220 if( q->_ai_char->_name == name) {
00221
00222 if(q == _head) {
00223 _head = q->_next;
00224 delete q;
00225 return;
00226 }
00227
00228 r->_next = q->_next;
00229 delete q;
00230 return;
00231 }
00232 r = q;
00233 q = q->_next;
00234 }
00235 }
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245 void AICharPool::print_list() {
00246 node* q;
00247 q = _head;
00248 while(q != NULL) {
00249 cout<<q->_ai_char->_name<<endl;
00250 q = q->_next;
00251 }
00252 }
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262 void AIWorld::add_obstacle(NodePath obstacle) {
00263 _obstacles.push_back(obstacle);
00264 }
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274 void AIWorld::remove_obstacle(NodePath obstacle) {
00275 for(unsigned int i = 0; i <= _obstacles.size(); ++i) {
00276 if(_obstacles[i] == obstacle) {
00277 _obstacles.erase(_obstacles.begin() + i);
00278 }
00279 }
00280 }