in coinrun/coinrun.cpp [1396:1422]
void Monster::step(const std::shared_ptr<Maze>& maze)
{
if (!is_flying && !is_walking)
return;
float control = sign(vx);
int ix = int(x);
int iy = int(y);
int look_left = maze->get_elem(ix-0, iy);
int look_right = maze->get_elem(ix+1, iy);
if (is_wall(look_left)) control = +1;
if (is_wall(look_right)) control = -1;
if (is_walking) {
int feel_left = maze->get_elem(ix-0, iy-1);
int feel_right = maze->get_elem(ix+1, iy-1);
if (!is_wall(feel_left)) control = +1;
if (!is_wall(feel_right)) control = -1;
}
vx = clip_abs(MONSTER_MIXRATE*control + (1-MONSTER_MIXRATE)*vx, MONSTER_SPEED);
x += vx;
y += vy;
for (int t=1; t<MONSTER_TRAIL; t++) {
prev_x[t-1] = prev_x[t];
prev_y[t-1] = prev_y[t];
}
prev_x[MONSTER_TRAIL-1] = x;
prev_y[MONSTER_TRAIL-1] = y;
}