| 2734 | } |
| 2735 | |
| 2736 | BOOL PM_DoRangeAttack(int pnum) |
| 2737 | { |
| 2738 | int origFrame, mistype; |
| 2739 | |
| 2740 | if ((DWORD)pnum >= MAX_PLRS) { |
| 2741 | app_fatal("PM_DoRangeAttack: illegal player %d", pnum); |
| 2742 | } |
| 2743 | |
| 2744 | origFrame = plr[pnum]._pAnimFrame; |
| 2745 | if (plr[pnum]._pIFlags & ISPL_QUICKATTACK && origFrame == 1) { |
| 2746 | plr[pnum]._pAnimFrame++; |
| 2747 | } |
| 2748 | if (plr[pnum]._pIFlags & ISPL_FASTATTACK && (origFrame == 1 || origFrame == 3)) { |
| 2749 | plr[pnum]._pAnimFrame++; |
| 2750 | } |
| 2751 | |
| 2752 | if (plr[pnum]._pAnimFrame == plr[pnum]._pAFNum) { |
| 2753 | mistype = MIS_ARROW; |
| 2754 | if (plr[pnum]._pIFlags & ISPL_FIRE_ARROWS) { |
| 2755 | mistype = MIS_FARROW; |
| 2756 | } |
| 2757 | if (plr[pnum]._pIFlags & ISPL_LIGHT_ARROWS) { |
| 2758 | mistype = MIS_LARROW; |
| 2759 | } |
| 2760 | AddMissile( |
| 2761 | plr[pnum].WorldX, |
| 2762 | plr[pnum].WorldY, |
| 2763 | plr[pnum]._pVar1, |
| 2764 | plr[pnum]._pVar2, |
| 2765 | plr[pnum]._pdir, |
| 2766 | mistype, |
| 2767 | 0, |
| 2768 | pnum, |
| 2769 | 4, |
| 2770 | 0); |
| 2771 | |
| 2772 | PlaySfxLoc(PS_BFIRE, plr[pnum].WorldX, plr[pnum].WorldY); |
| 2773 | |
| 2774 | if (WeaponDur(pnum, 40)) { |
| 2775 | StartStand(pnum, plr[pnum]._pdir); |
| 2776 | ClearPlrPVars(pnum); |
| 2777 | return TRUE; |
| 2778 | } |
| 2779 | } |
| 2780 | |
| 2781 | if (plr[pnum]._pAnimFrame >= plr[pnum]._pAFrames) { |
| 2782 | StartStand(pnum, plr[pnum]._pdir); |
| 2783 | ClearPlrPVars(pnum); |
| 2784 | return TRUE; |
| 2785 | } else { |
| 2786 | return FALSE; |
| 2787 | } |
| 2788 | } |
| 2789 | |
| 2790 | void ShieldDur(int pnum) |
| 2791 | { |
no test coverage detected