| 610 | } |
| 611 | |
| 612 | void BattleUnit::refreshUnitVision(GameState &state, bool forceBlind, |
| 613 | StateRef<BattleUnit> targetUnit) |
| 614 | { |
| 615 | auto &battle = *state.current_battle; |
| 616 | auto lastVisibleUnits = visibleUnits; |
| 617 | auto ticks = state.gameTime.getTicks(); |
| 618 | visibleUnits.clear(); |
| 619 | visibleEnemies.clear(); |
| 620 | |
| 621 | // Vision is actually updated only if conscious, otherwise we clear visible units and that's it |
| 622 | if (isConscious()) |
| 623 | { |
| 624 | if (!targetUnit) |
| 625 | { |
| 626 | if (!forceBlind) |
| 627 | { |
| 628 | calculateVisionToTerrain(state); |
| 629 | calculateVisionToUnits(state); |
| 630 | } |
| 631 | } |
| 632 | else |
| 633 | { |
| 634 | visibleUnits = lastVisibleUnits; |
| 635 | if (!forceBlind && calculateVisionToUnit(state, *targetUnit)) |
| 636 | { |
| 637 | if (visibleUnits.find(targetUnit) == visibleUnits.end()) |
| 638 | { |
| 639 | visibleUnits.insert(targetUnit); |
| 640 | } |
| 641 | } |
| 642 | else |
| 643 | { |
| 644 | if (visibleUnits.find(targetUnit) != visibleUnits.end()) |
| 645 | { |
| 646 | visibleUnits.erase(targetUnit); |
| 647 | } |
| 648 | } |
| 649 | } |
| 650 | } |
| 651 | |
| 652 | // Add newly visible units to owner's list and enemy list |
| 653 | for (auto &vu : visibleUnits) |
| 654 | { |
| 655 | // owner's visible units list |
| 656 | if (lastVisibleUnits.find(vu) == lastVisibleUnits.end() && |
| 657 | battle.visibleUnits[owner].find(vu) == battle.visibleUnits[owner].end()) |
| 658 | { |
| 659 | battle.visibleUnits[owner].insert(vu); |
| 660 | if (owner == state.current_battle->currentPlayer && |
| 661 | owner->isRelatedTo(vu->owner) == Organisation::Relation::Hostile && |
| 662 | (battle.lastVisibleTime[owner].find(vu) == battle.lastVisibleTime[owner].end() || |
| 663 | battle.lastVisibleTime[owner][vu] + TICKS_SUPPRESS_SPOTTED_MESSAGES <= ticks)) |
| 664 | { |
| 665 | vu->sendAgentEvent(state, GameEventType::HostileSpotted); |
| 666 | state.current_battle->notifyAction(vu->position, vu); |
| 667 | } |
| 668 | } |
| 669 | // battle and units's visible enemies list (Do not count civilians as enemy) |
no test coverage detected