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

Function MAI_Snake

Source/monster.cpp:3024–3105  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

3022}
3023
3024void MAI_Snake(int i)
3025{
3026 MonsterStruct *Monst;
3027 int fx, fy, mx, my, md;
3028 int pnum;
3029 int tmp;
3030
3031 if ((DWORD)i >= MAXMONSTERS) {
3032 app_fatal("MAI_Snake: Invalid monster %d", i);
3033 }
3034 char pattern[6] = { 1, 1, 0, -1, -1, 0 };
3035 Monst = monster + i;
3036 pnum = Monst->_menemy;
3037 if (Monst->_mmode != MM_STAND || Monst->_msquelch == 0)
3038 return;
3039 fx = Monst->_menemyx;
3040 fy = Monst->_menemyy;
3041 mx = Monst->_mx - fx;
3042 my = Monst->_my - fy;
3043 md = GetDirection(Monst->_mx, Monst->_my, Monst->_lastx, Monst->_lasty);
3044 Monst->_mdir = md;
3045 if (abs(mx) >= 2 || abs(my) >= 2) {
3046 if (abs(mx) < 3 && abs(my) < 3 && LineClearF1(PosOkMonst, i, Monst->_mx, Monst->_my, fx, fy) && Monst->_mVar1 != MM_CHARGE) {
3047 if (AddMissile(Monst->_mx, Monst->_my, fx, fy, md, MIS_RHINO, pnum, i, 0, 0) != -1) {
3048 PlayEffect(i, 0);
3049 dMonster[Monst->_mx][Monst->_my] = -(i + 1);
3050 Monst->_mmode = MM_CHARGE;
3051 }
3052 } else if (Monst->_mVar1 == MM_DELAY || random_(106, 100) >= 35 - 2 * Monst->_mint) {
3053 if (md + pattern[Monst->_mgoalvar1] < 0) {
3054 tmp = md + pattern[Monst->_mgoalvar1] + 8;
3055 } else {
3056 tmp = md + pattern[Monst->_mgoalvar1] - 8;
3057 if (md + pattern[Monst->_mgoalvar1] < 8)
3058 tmp = md + pattern[Monst->_mgoalvar1];
3059 }
3060 Monst->_mgoalvar1++;
3061 if (Monst->_mgoalvar1 > 5)
3062 Monst->_mgoalvar1 = 0;
3063 if (tmp - Monst->_mgoalvar2 < 0) {
3064 md = tmp - Monst->_mgoalvar2 + 8;
3065 } else if (tmp - Monst->_mgoalvar2 >= 8) {
3066 md = tmp - Monst->_mgoalvar2 - 8;
3067 } else
3068 md = tmp - Monst->_mgoalvar2;
3069 if (md > 0) {
3070 if (md < 4) {
3071 if (Monst->_mgoalvar2 + 1 < 0) {
3072 md = Monst->_mgoalvar2 + 9;
3073 } else if (Monst->_mgoalvar2 + 1 >= 8) {
3074 md = Monst->_mgoalvar2 - 7;
3075 } else
3076 md = Monst->_mgoalvar2 + 1;
3077 Monst->_mgoalvar2 = md;
3078 } else if (md == 4) {
3079 Monst->_mgoalvar2 = tmp;
3080 } else {
3081 if (Monst->_mgoalvar2 - 1 < 0) {

Callers

nothing calls this directly

Calls 10

app_fatalFunction · 0.85
GetDirectionFunction · 0.85
LineClearF1Function · 0.85
AddMissileFunction · 0.85
PlayEffectFunction · 0.85
random_Function · 0.85
M_DumbWalkFunction · 0.85
M_CallWalk2Function · 0.85
M_StartDelayFunction · 0.85
M_StartAttackFunction · 0.85

Tested by

no test coverage detected