| 3313 | } |
| 3314 | |
| 3315 | void MAI_Fireman(int i) |
| 3316 | { |
| 3317 | int xd, yd; |
| 3318 | int md, pnum; |
| 3319 | int fx, fy; |
| 3320 | MonsterStruct *Monst; |
| 3321 | |
| 3322 | if ((DWORD)i >= MAXMONSTERS) |
| 3323 | app_fatal("MAI_Fireman: Invalid monster %d", i); |
| 3324 | |
| 3325 | Monst = &monster[i]; |
| 3326 | if (monster[i]._mmode != MM_STAND || Monst->_msquelch == 0) |
| 3327 | return; |
| 3328 | |
| 3329 | pnum = monster[i]._menemy; |
| 3330 | fx = monster[i]._menemyx; |
| 3331 | fy = monster[i]._menemyy; |
| 3332 | xd = monster[i]._mx - fx; |
| 3333 | yd = monster[i]._my - fy; |
| 3334 | |
| 3335 | md = M_GetDir(i); |
| 3336 | if (Monst->_mgoal == MGOAL_NORMAL) { |
| 3337 | if (LineClear(Monst->_mx, Monst->_my, fx, fy) |
| 3338 | && AddMissile(Monst->_mx, Monst->_my, fx, fy, md, MIS_FIREMAN, pnum, i, 0, 0) != -1) { |
| 3339 | Monst->_mmode = MM_CHARGE; |
| 3340 | Monst->_mgoal = MGOAL_SHOOT; |
| 3341 | Monst->_mgoalvar1 = 0; |
| 3342 | } |
| 3343 | } else if (Monst->_mgoal == MGOAL_SHOOT) { |
| 3344 | if (Monst->_mgoalvar1 == 3) { |
| 3345 | Monst->_mgoal = MGOAL_NORMAL; |
| 3346 | M_StartFadeout(i, md, TRUE); |
| 3347 | } else if (LineClear(Monst->_mx, Monst->_my, fx, fy)) { |
| 3348 | M_StartRAttack(i, MIS_KRULL, 4); |
| 3349 | Monst->_mgoalvar1++; |
| 3350 | } else { |
| 3351 | M_StartDelay(i, random_(112, 10) + 5); |
| 3352 | Monst->_mgoalvar1++; |
| 3353 | } |
| 3354 | } else if (Monst->_mgoal == MGOAL_RETREAT) { |
| 3355 | M_StartFadein(i, md, FALSE); |
| 3356 | Monst->_mgoal = MGOAL_SHOOT; |
| 3357 | } |
| 3358 | Monst->_mdir = md; |
| 3359 | random_(112, 100); |
| 3360 | if (Monst->_mmode != MM_STAND) |
| 3361 | return; |
| 3362 | |
| 3363 | if (abs(xd) < 2 && abs(yd) < 2 && Monst->_mgoal == MGOAL_NORMAL) { |
| 3364 | M_TryH2HHit(i, monster[i]._menemy, monster[i].mHit, monster[i].mMinDamage, monster[i].mMaxDamage); |
| 3365 | Monst->_mgoal = MGOAL_RETREAT; |
| 3366 | if (!M_CallWalk(i, opposite[md])) { |
| 3367 | M_StartFadein(i, md, FALSE); |
| 3368 | Monst->_mgoal = MGOAL_SHOOT; |
| 3369 | } |
| 3370 | } else if (!M_CallWalk(i, md) && (Monst->_mgoal == MGOAL_NORMAL || Monst->_mgoal == MGOAL_RETREAT)) { |
| 3371 | M_StartFadein(i, md, FALSE); |
| 3372 | Monst->_mgoal = MGOAL_SHOOT; |
nothing calls this directly
no test coverage detected