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

Function MAI_RoundRanged

Source/monster.cpp:3731–3794  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

3729}
3730
3731void 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 }

Callers 4

MAI_MagmaFunction · 0.85
MAI_StormFunction · 0.85
MAI_AcidFunction · 0.85
MAI_DiabloFunction · 0.85

Calls 11

app_fatalFunction · 0.85
GetDirectionFunction · 0.85
MonstCheckDoorsFunction · 0.85
random_Function · 0.85
DirOKFunction · 0.85
LineClearFunction · 0.85
M_StartRSpAttackFunction · 0.85
M_RoundWalkFunction · 0.85
M_CallWalkFunction · 0.85
M_StartAttackFunction · 0.85
M_StartDelayFunction · 0.85

Tested by

no test coverage detected