| 3476 | } |
| 3477 | |
| 3478 | void MAI_Round(int i, BOOL special) |
| 3479 | { |
| 3480 | MonsterStruct *Monst; |
| 3481 | int fx, fy; |
| 3482 | int mx, my, md; |
| 3483 | int dist, v; |
| 3484 | |
| 3485 | if ((DWORD)i >= MAXMONSTERS) |
| 3486 | app_fatal("MAI_Round: Invalid monster %d", i); |
| 3487 | Monst = monster + i; |
| 3488 | if (Monst->_mmode == MM_STAND && Monst->_msquelch != 0) { |
| 3489 | fy = Monst->_menemyy; |
| 3490 | fx = Monst->_menemyx; |
| 3491 | mx = Monst->_mx - fx; |
| 3492 | my = Monst->_my - fy; |
| 3493 | md = GetDirection(Monst->_mx, Monst->_my, Monst->_lastx, Monst->_lasty); |
| 3494 | if (Monst->_msquelch < UCHAR_MAX) |
| 3495 | MonstCheckDoors(i); |
| 3496 | v = random_(114, 100); |
| 3497 | if ((abs(mx) >= 2 || abs(my) >= 2) && Monst->_msquelch == UCHAR_MAX && dTransVal[Monst->_mx][Monst->_my] == dTransVal[fx][fy]) { |
| 3498 | if (Monst->_mgoal == MGOAL_MOVE || (abs(mx) >= 4 || abs(my) >= 4) && random_(115, 4) == 0) { |
| 3499 | if (Monst->_mgoal != MGOAL_MOVE) { |
| 3500 | Monst->_mgoalvar1 = 0; |
| 3501 | Monst->_mgoalvar2 = random_(116, 2); |
| 3502 | } |
| 3503 | Monst->_mgoal = MGOAL_MOVE; |
| 3504 | if (abs(mx) > abs(my)) |
| 3505 | dist = abs(mx); |
| 3506 | else |
| 3507 | dist = abs(my); |
| 3508 | if (Monst->_mgoalvar1++ >= 2 * dist && DirOK(i, md) || dTransVal[Monst->_mx][Monst->_my] != dTransVal[fx][fy]) { |
| 3509 | Monst->_mgoal = MGOAL_NORMAL; |
| 3510 | } else if (!M_RoundWalk(i, md, &Monst->_mgoalvar2)) { |
| 3511 | M_StartDelay(i, random_(125, 10) + 10); |
| 3512 | } |
| 3513 | } |
| 3514 | } else |
| 3515 | Monst->_mgoal = MGOAL_NORMAL; |
| 3516 | if (Monst->_mgoal == MGOAL_NORMAL) { |
| 3517 | if (abs(mx) >= 2 || abs(my) >= 2) { |
| 3518 | if (Monst->_mVar2 > 20 && v < 2 * Monst->_mint + 28 |
| 3519 | || (Monst->_mVar1 == MM_WALK || Monst->_mVar1 == MM_WALK2 || Monst->_mVar1 == MM_WALK3) |
| 3520 | && Monst->_mVar2 == 0 |
| 3521 | && v < 2 * Monst->_mint + 78) { |
| 3522 | M_CallWalk(i, md); |
| 3523 | } |
| 3524 | } else if (v < 2 * Monst->_mint + 23) { |
| 3525 | Monst->_mdir = md; |
| 3526 | if (special && Monst->_mhitpoints < (Monst->_mmaxhp >> 1) && random_(117, 2) != 0) |
| 3527 | M_StartSpAttack(i); |
| 3528 | else |
| 3529 | M_StartAttack(i); |
| 3530 | } |
| 3531 | } |
| 3532 | if (Monst->_mmode == MM_STAND) |
| 3533 | Monst->_mAnimData = Monst->MType->Anims[MA_STAND].Data[md]; |
| 3534 | } |
| 3535 | } |
no test coverage detected