| 1980 | } |
| 1981 | |
| 1982 | void Battle::checkMissionEnd(GameState &state, bool retreated, bool forceReCheck) |
| 1983 | { |
| 1984 | auto endBeginTimer = std::max((unsigned)1, missionEndTimer); |
| 1985 | if (forceReCheck) |
| 1986 | { |
| 1987 | missionEndTimer = 0; |
| 1988 | } |
| 1989 | else if (missionEndTimer > 0) |
| 1990 | { |
| 1991 | return; |
| 1992 | } |
| 1993 | loserHasRetreated = retreated; |
| 1994 | auto civ = state.getCivilian(); |
| 1995 | auto player = state.getPlayer(); |
| 1996 | std::set<StateRef<Organisation>> orgsAlive; |
| 1997 | for (auto &p : participants) |
| 1998 | { |
| 1999 | if (p == civ) |
| 2000 | { |
| 2001 | continue; |
| 2002 | } |
| 2003 | for (auto &u : units) |
| 2004 | { |
| 2005 | if (u.second->owner == p && u.second->isConscious()) |
| 2006 | { |
| 2007 | bool normalUnit = false; |
| 2008 | for (auto &mst : u.second->agent->type->bodyType->allowed_movement_states) |
| 2009 | { |
| 2010 | switch (mst) |
| 2011 | { |
| 2012 | case OpenApoc::MovementState::Normal: |
| 2013 | case OpenApoc::MovementState::Running: |
| 2014 | case OpenApoc::MovementState::Strafing: |
| 2015 | case OpenApoc::MovementState::Reverse: |
| 2016 | case OpenApoc::MovementState::Brainsuck: |
| 2017 | normalUnit = true; |
| 2018 | break; |
| 2019 | default: |
| 2020 | break; |
| 2021 | } |
| 2022 | if (normalUnit) |
| 2023 | break; |
| 2024 | } |
| 2025 | |
| 2026 | if (normalUnit) |
| 2027 | { |
| 2028 | orgsAlive.insert(p); |
| 2029 | break; |
| 2030 | } |
| 2031 | } |
| 2032 | } |
| 2033 | } |
| 2034 | if (orgsAlive.find(player) == orgsAlive.end()) |
| 2035 | { |
| 2036 | playerWon = false; |
| 2037 | missionEndTimer = endBeginTimer; |
| 2038 | } |
| 2039 | else |
no test coverage detected