ReC98/th05/main/boss/move.cpp

61 lines
1.4 KiB
C++

#include "th05/main/boss/impl.hpp"
extern y_direction_t boss_flystep_random_next_y_direction;
bool pascal near boss_flystep_random(int frame)
{
flystep_random_for(
boss,
boss_flystep_random_next_y_direction,
4.0f,
BOSS_FLYSTEP_RANDOM_FRAMES,
boss_flystep_random_clamp.left.v,
boss_flystep_random_clamp.right.v,
boss_flystep_random_clamp.top.v,
boss_flystep_random_clamp.bottom.v,
boss_sprite_left,
boss_sprite_right,
boss_sprite_stay,
frame
);
}
static const int TOWARDS_FRACTION = 16; // higher = slower
inline int towards(int val, int speed = 1) {
return (val / (TOWARDS_FRACTION / speed));
}
bool pascal near boss_flystep_towards(subpixel_t target_x, subpixel_t target_y)
{
int reached_dimensions = 0;
subpixel_t dist;
dist = (target_x - boss.pos.cur.x.v);
/**/ if(towards(dist) != 0) { boss.pos.cur.x.v += towards(dist); }
else if(towards(dist, 4) != 0) { boss.pos.cur.x.v += towards(dist, 4); }
else {
boss.pos.cur.x.v = target_x;
reached_dimensions++;
}
if(dist < 0) {
boss.sprite = boss_sprite_left;
} else {
boss.sprite = boss_sprite_right;
}
dist = (target_y - boss.pos.cur.y.v);
/**/ if(towards(dist) != 0) { boss.pos.cur.y.v += towards(dist); }
else if(towards(dist, 8) != 0) { boss.pos.cur.y.v += towards(dist, 8); }
else {
boss.pos.cur.y.v = target_y;
reached_dimensions++;
}
if(reached_dimensions != 2) {
return false;
}
boss.sprite = boss_sprite_stay;
return true;
}