| 3729 | } |
| 3730 | |
| 3731 | void MAI_RoundRanged(int i, int missile_type, BOOL checkdoors, int dam, int lessmissiles) |
| 3732 | { |
| 3733 | MonsterStruct *Monst; |
| 3734 | int mx, my; |
| 3735 | int fx, fy; |
| 3736 | int md, dist, v; |
| 3737 | |
| 3738 | if ((DWORD)i >= MAXMONSTERS) |
| 3739 | app_fatal("MAI_RoundRanged: Invalid monster %d", i); |
| 3740 | Monst = monster + i; |
| 3741 | if (Monst->_mmode == MM_STAND && Monst->_msquelch != 0) { |
| 3742 | fx = Monst->_menemyx; |
| 3743 | fy = Monst->_menemyy; |
| 3744 | mx = Monst->_mx - fx; |
| 3745 | my = Monst->_my - fy; |
| 3746 | md = GetDirection(Monst->_mx, Monst->_my, Monst->_lastx, Monst->_lasty); |
| 3747 | if (checkdoors && Monst->_msquelch < UCHAR_MAX) |
| 3748 | MonstCheckDoors(i); |
| 3749 | v = random_(121, 10000); |
| 3750 | if ((abs(mx) >= 2 || abs(my) >= 2) && Monst->_msquelch == UCHAR_MAX && dTransVal[Monst->_mx][Monst->_my] == dTransVal[fx][fy]) { |
| 3751 | if (Monst->_mgoal == MGOAL_MOVE || ((abs(mx) >= 3 || abs(my) >= 3) && random_(122, 4 << lessmissiles) == 0)) { |
| 3752 | if (Monst->_mgoal != MGOAL_MOVE) { |
| 3753 | Monst->_mgoalvar1 = 0; |
| 3754 | Monst->_mgoalvar2 = random_(123, 2); |
| 3755 | } |
| 3756 | Monst->_mgoal = MGOAL_MOVE; |
| 3757 | if (abs(mx) > abs(my)) { |
| 3758 | dist = abs(mx); |
| 3759 | } else { |
| 3760 | dist = abs(my); |
| 3761 | } |
| 3762 | if (Monst->_mgoalvar1++ >= 2 * dist && DirOK(i, md)) { |
| 3763 | Monst->_mgoal = MGOAL_NORMAL; |
| 3764 | } else if (v<500 * (Monst->_mint + 1)>> lessmissiles |
| 3765 | && (LineClear(Monst->_mx, Monst->_my, fx, fy))) { |
| 3766 | M_StartRSpAttack(i, missile_type, dam); |
| 3767 | } else { |
| 3768 | M_RoundWalk(i, md, &Monst->_mgoalvar2); |
| 3769 | } |
| 3770 | } |
| 3771 | } else { |
| 3772 | Monst->_mgoal = MGOAL_NORMAL; |
| 3773 | } |
| 3774 | if (Monst->_mgoal == MGOAL_NORMAL) { |
| 3775 | if (((abs(mx) >= 3 || abs(my) >= 3) && v < ((500 * (Monst->_mint + 2)) >> lessmissiles) |
| 3776 | || v < ((500 * (Monst->_mint + 1)) >> lessmissiles)) |
| 3777 | && LineClear(Monst->_mx, Monst->_my, fx, fy)) { |
| 3778 | M_StartRSpAttack(i, missile_type, dam); |
| 3779 | } else if (abs(mx) >= 2 || abs(my) >= 2) { |
| 3780 | v = random_(124, 100); |
| 3781 | if (v < 1000 * (Monst->_mint + 5) |
| 3782 | || (Monst->_mVar1 == MM_WALK || Monst->_mVar1 == MM_WALK2 || Monst->_mVar1 == MM_WALK3) && Monst->_mVar2 == 0 && v < 1000 * (Monst->_mint + 8)) { |
| 3783 | M_CallWalk(i, md); |
| 3784 | } |
| 3785 | } else if (v < 1000 * (Monst->_mint + 6)) { |
| 3786 | Monst->_mdir = md; |
| 3787 | M_StartAttack(i); |
| 3788 | } |
no test coverage detected