| 638 | } |
| 639 | |
| 640 | void AEquipment::explode(GameState &state) |
| 641 | { |
| 642 | Vec3<float> position; |
| 643 | auto item = ownerItem.lock(); |
| 644 | if (item) |
| 645 | { |
| 646 | position = item->position; |
| 647 | } |
| 648 | else |
| 649 | { |
| 650 | position = ownerAgent->unit->position; |
| 651 | } |
| 652 | if (ownerAgent) |
| 653 | { |
| 654 | if (!ownerUnit) |
| 655 | { |
| 656 | ownerUnit = ownerAgent->unit; |
| 657 | } |
| 658 | ownerAgent->removeEquipment(state, shared_from_this()); |
| 659 | } |
| 660 | switch (type->type) |
| 661 | { |
| 662 | case AEquipmentType::Type::Grenade: |
| 663 | state.current_battle->addExplosion( |
| 664 | state, position, type->explosion_graphic, type->damage_type, type->damage, |
| 665 | type->explosion_depletion_rate, |
| 666 | ownerUnit ? ownerUnit->owner : (ownerAgent ? ownerAgent->owner : ownerOrganisation), |
| 667 | ownerUnit); |
| 668 | break; |
| 669 | case AEquipmentType::Type::Weapon: |
| 670 | case AEquipmentType::Type::Ammo: |
| 671 | { |
| 672 | auto payload = getPayloadType(); |
| 673 | // If no payload or brainsucker then nothing |
| 674 | if (!payload || payload->damage_type->effectType == DamageType::EffectType::Brainsucker) |
| 675 | { |
| 676 | break; |
| 677 | } |
| 678 | if (!config().getBool("OpenApoc.NewFeature.PayloadExplosion")) |
| 679 | { |
| 680 | break; |
| 681 | } |
| 682 | // If explosive just blow up |
| 683 | if (payload->damage_type->explosive) |
| 684 | { |
| 685 | state.current_battle->addExplosion( |
| 686 | state, position, payload->explosion_graphic, payload->damage_type, |
| 687 | payload->damage, payload->explosion_depletion_rate, |
| 688 | ownerUnit ? ownerUnit->owner |
| 689 | : (ownerAgent ? ownerAgent->owner : ownerOrganisation), |
| 690 | ownerUnit); |
| 691 | break; |
| 692 | } |
| 693 | // Otherwise shoot stray shots into air |
| 694 | auto shots = std::min(ammo, (int)MAX_PAYLOAD_EXPLOSION_SHOTS); |
| 695 | auto bItem = ownerItem.lock(); |
| 696 | if (!bItem) |
| 697 | { |
no test coverage detected