MCPcopy Create free account
hub / github.com/diasurgical/devilution / MAI_Round

Function MAI_Round

Source/monster.cpp:3478–3535  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

3476}
3477
3478void 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}

Callers 3

MAI_GoatMcFunction · 0.85
MAI_GargFunction · 0.85
MAI_GarbudFunction · 0.85

Calls 10

app_fatalFunction · 0.85
GetDirectionFunction · 0.85
MonstCheckDoorsFunction · 0.85
random_Function · 0.85
DirOKFunction · 0.85
M_RoundWalkFunction · 0.85
M_StartDelayFunction · 0.85
M_CallWalkFunction · 0.85
M_StartSpAttackFunction · 0.85
M_StartAttackFunction · 0.85

Tested by

no test coverage detected