| 4041 | } |
| 4042 | |
| 4043 | void MAI_Rhino(int i) |
| 4044 | { |
| 4045 | MonsterStruct *Monst; |
| 4046 | int mx, my, fx, fy; |
| 4047 | int v, dist, md; |
| 4048 | |
| 4049 | if ((DWORD)i >= MAXMONSTERS) |
| 4050 | app_fatal("MAI_Rhino: Invalid monster %d", i); |
| 4051 | Monst = monster + i; |
| 4052 | if (Monst->_mmode == MM_STAND && Monst->_msquelch != 0) { |
| 4053 | fx = Monst->_menemyx; |
| 4054 | fy = Monst->_menemyy; |
| 4055 | mx = Monst->_mx - fx; |
| 4056 | my = Monst->_my - fy; |
| 4057 | md = GetDirection(Monst->_mx, Monst->_my, Monst->_lastx, Monst->_lasty); |
| 4058 | if (Monst->_msquelch < UCHAR_MAX) |
| 4059 | MonstCheckDoors(i); |
| 4060 | v = random_(131, 100); |
| 4061 | if (abs(mx) >= 2 || abs(my) >= 2) { |
| 4062 | if (Monst->_mgoal == MGOAL_MOVE || (abs(mx) >= 5 || abs(my) >= 5) && random_(132, 4) != 0) { |
| 4063 | if (Monst->_mgoal != MGOAL_MOVE) { |
| 4064 | Monst->_mgoalvar1 = 0; |
| 4065 | Monst->_mgoalvar2 = random_(133, 2); |
| 4066 | } |
| 4067 | Monst->_mgoal = MGOAL_MOVE; |
| 4068 | if (abs(mx) > abs(my)) { |
| 4069 | dist = abs(mx); |
| 4070 | } else { |
| 4071 | dist = abs(my); |
| 4072 | } |
| 4073 | if (Monst->_mgoalvar1++ >= 2 * dist || dTransVal[Monst->_mx][Monst->_my] != dTransVal[fx][fy]) { |
| 4074 | Monst->_mgoal = MGOAL_NORMAL; |
| 4075 | } else if (!M_RoundWalk(i, md, &Monst->_mgoalvar2)) { |
| 4076 | M_StartDelay(i, random_(125, 10) + 10); |
| 4077 | } |
| 4078 | } |
| 4079 | } else |
| 4080 | Monst->_mgoal = MGOAL_NORMAL; |
| 4081 | if (Monst->_mgoal == MGOAL_NORMAL) { |
| 4082 | if ((abs(mx) >= 5 || abs(my) >= 5) |
| 4083 | && v < 2 * Monst->_mint + 43 |
| 4084 | && LineClearF1(PosOkMonst, i, Monst->_mx, Monst->_my, fx, fy)) { |
| 4085 | if (AddMissile(Monst->_mx, Monst->_my, fx, fy, md, MIS_RHINO, Monst->_menemy, i, 0, 0) != -1) { |
| 4086 | if (Monst->MData->snd_special) |
| 4087 | PlayEffect(i, 3); |
| 4088 | Monst->_mmode = MM_CHARGE; |
| 4089 | dMonster[Monst->_mx][Monst->_my] = -1 - i; |
| 4090 | } |
| 4091 | } else { |
| 4092 | if (abs(mx) >= 2 || abs(my) >= 2) { |
| 4093 | v = random_(134, 100); |
| 4094 | if (v >= 2 * Monst->_mint + 33 |
| 4095 | && (Monst->_mVar1 != MM_WALK && Monst->_mVar1 != MM_WALK2 && Monst->_mVar1 != MM_WALK3 |
| 4096 | || Monst->_mVar2 |
| 4097 | || v >= 2 * Monst->_mint + 83)) { |
| 4098 | M_StartDelay(i, random_(135, 10) + 10); |
| 4099 | } else { |
| 4100 | M_CallWalk(i, md); |
nothing calls this directly
no test coverage detected