| 197 | } |
| 198 | |
| 199 | void CGameTaskManager::UpdateTasks() |
| 200 | { |
| 201 | auto& tasks = GameTasks(); |
| 202 | |
| 203 | if (tasks.empty()) |
| 204 | return; |
| 205 | |
| 206 | auto act_task = ActiveTask(); |
| 207 | bool need_update_active_task = !act_task || act_task->Objective(0).TaskState() != eTaskStateInProgress; |
| 208 | |
| 209 | CGameTask* max_prio_task{}; |
| 210 | u16 max_prio_task_obj{}; |
| 211 | |
| 212 | size_t processed{}; |
| 213 | auto iter = tasks.rbegin(); |
| 214 | while (iter != tasks.rend()) //Реверсивный перебор тасков из-за того что походу внутри SetTaskState таски могут удалиться, из-за этого обычный итератор тут крашится. |
| 215 | { |
| 216 | const auto size = tasks.size(); |
| 217 | |
| 218 | auto& task = *(iter++); |
| 219 | // |
| 220 | |
| 221 | auto* t = task.game_task; |
| 222 | for (u16 i = 0; i < t->m_Objectives.size(); ++i) |
| 223 | { |
| 224 | auto& obj = t->Objective(i); |
| 225 | if (obj.TaskState() != eTaskStateInProgress) |
| 226 | { |
| 227 | if (i == 0) |
| 228 | { |
| 229 | //need_update_active_task = true; |
| 230 | break; |
| 231 | } |
| 232 | else |
| 233 | continue; |
| 234 | } |
| 235 | |
| 236 | ETaskState state = obj.UpdateState(); |
| 237 | if (state == eTaskStateFail || state == eTaskStateCompleted || state == eTaskStateSkiped) |
| 238 | { |
| 239 | SetTaskState(t, i, state); |
| 240 | |
| 241 | if (i == 0) |
| 242 | { |
| 243 | need_update_active_task = true; |
| 244 | } |
| 245 | |
| 246 | if (!need_update_active_task) |
| 247 | { |
| 248 | // Тут проверяем заново, потому что в функции выше активный таск может обновиться |
| 249 | act_task = ActiveTask(); |
| 250 | need_update_active_task = !act_task || act_task->Objective(0).TaskState() != eTaskStateInProgress; |
| 251 | } |
| 252 | } |
| 253 | // Тут ставим активным только первый objective если он один либо второй, чтоб тут случайно не назначился тот который скрыт опцией show_objectives_ondemand. |
| 254 | else if ((i == 0 && t->m_Objectives.size() == 1) || (i == 1 && t->Objective(0).TaskState() == eTaskStateInProgress)) |
| 255 | { |
| 256 | if (!max_prio_task || max_prio_task->m_priority > t->m_priority) |
no test coverage detected