Browse Source

Use bound functions for LineClear test function pointer

pull/2406/head
ephphatha 5 years ago committed by Anders Jenbo
parent
commit
488ee03f53
  1. 2
      Source/missiles.cpp
  2. 23
      Source/monster.cpp
  3. 4
      Source/monster.h

2
Source/missiles.cpp

@ -4323,7 +4323,7 @@ void MI_Fireman(int i)
} else {
j = dMonster[b.x][b.y];
}
if (!PosOkMissile(0, b) || (j > 0 && (Missiles[i]._miVar1 & 1) == 0)) {
if (!PosOkMissile(b) || (j > 0 && (Missiles[i]._miVar1 & 1) == 0)) {
Missiles[i].position.velocity *= -1;
Missiles[i]._mimfnum = opposite[Missiles[i]._mimfnum];
Missiles[i]._miAnimData = monster.MType->GetAnimData(MonsterGraphic::Walk).CelSpritesForDirections[Missiles[i]._mimfnum]->Data();

23
Source/monster.cpp

@ -1942,14 +1942,14 @@ int SpawnSkeleton(Point position, Direction dir)
return skel;
}
bool IsNotSolid(int /*entity*/, Point position)
bool IsNotSolid(Point position)
{
return !nSolidTable[dPiece[position.x][position.y]];
}
bool IsLineNotSolid(Point startPoint, Point endPoint)
{
return LineClear(IsNotSolid, 0, startPoint, endPoint);
return LineClear(IsNotSolid, startPoint, endPoint);
}
void GroupUnity(int i)
@ -2207,8 +2207,7 @@ bool AiPlanPath(int i)
}
bool clear = LineClear(
MonsterIsTileClear,
i,
std::bind(MonsterIsTileAvalible, i, std::placeholders::_1),
monster.position.tile,
monster.enemyPosition);
if (!clear || (monster._pathcount >= 5 && monster._pathcount < 8)) {
@ -2644,7 +2643,7 @@ void RhinoAi(int i)
if (monster._mgoal == MGOAL_NORMAL) {
if (dist >= 5
&& v < 2 * monster._mint + 43
&& LineClear(MonsterIsTileAvailable, i, monster.position.tile, { fx, fy })) {
&& LineClear(std::bind(MonsterIsTileAvailable, i, std::placeholders::_1), monster.position.tile, { fx, fy })) {
if (AddMissile(monster.position.tile, { fx, fy }, md, MIS_RHINO, monster._menemy, i, 0, 0) != -1) {
if (monster.MData->snd_special)
PlayEffect(monster, 3);
@ -2847,7 +2846,7 @@ void BatAi(int i)
if (monster.MType->mtype == MT_GLOOM
&& (abs(xd) >= 5 || abs(yd) >= 5)
&& v < 4 * monster._mint + 33
&& LineClear(MonsterIsTileAvailable, i, monster.position.tile, { fx, fy })) {
&& LineClear(std::bind(MonsterIsTileAvailable, i, std::placeholders::_1), monster.position.tile, { fx, fy })) {
if (AddMissile(monster.position.tile, { fx, fy }, md, MIS_RHINO, pnum, i, 0, 0) != -1) {
dMonster[monster.position.tile.x][monster.position.tile.y] = -(i + 1);
monster._mmode = MM_CHARGE;
@ -3176,7 +3175,7 @@ void SnakeAi(int i)
Direction md = GetDirection(monster.position.tile, monster.position.last);
monster._mdir = md;
if (abs(mx) >= 2 || abs(my) >= 2) {
if (abs(mx) < 3 && abs(my) < 3 && LineClear(MonsterIsTileAvailable, i, monster.position.tile, { fx, fy }) && monster._mVar1 != MM_CHARGE) {
if (abs(mx) < 3 && abs(my) < 3 && LineClear(std::bind(MonsterIsTileAvailable, i, std::placeholders::_1), monster.position.tile, { fx, fy }) && monster._mVar1 != MM_CHARGE) {
if (AddMissile(monster.position.tile, { fx, fy }, md, MIS_RHINO, pnum, i, 0, 0) != -1) {
PlayEffect(monster, 0);
dMonster[monster.position.tile.x][monster.position.tile.y] = -(i + 1);
@ -4646,17 +4645,17 @@ bool DirOK(int i, Direction mdir)
return mcount == monster.packsize;
}
bool PosOkMissile(int /*entity*/, Point position)
bool PosOkMissile(Point position)
{
return !nMissileTable[dPiece[position.x][position.y]] && (dFlags[position.x][position.y] & BFLAG_MONSTLR) == 0;
}
bool LineClearMissile(Point startPoint, Point endPoint)
{
return LineClear(PosOkMissile, 0, startPoint, endPoint);
return LineClear(PosOkMissile, startPoint, endPoint);
}
bool LineClear(bool (*clear)(int, Point), int entity, Point startPoint, Point endPoint)
bool LineClear(const std::function<bool(Point)> &clear, Point startPoint, Point endPoint)
{
Point position = startPoint;
@ -4692,7 +4691,7 @@ bool LineClear(bool (*clear)(int, Point), int entity, Point startPoint, Point en
position.y += yincD;
}
position.x++;
done = position != startPoint && !clear(entity, position);
done = position != startPoint && !clear(position);
}
} else {
if (dy < 0) {
@ -4724,7 +4723,7 @@ bool LineClear(bool (*clear)(int, Point), int entity, Point startPoint, Point en
position.x += xincD;
}
position.y++;
done = position != startPoint && !clear(entity, position);
done = position != startPoint && !clear(position);
}
}
return position == endPoint;

4
Source/monster.h

@ -255,9 +255,9 @@ void DeleteMonsterList();
void ProcessMonsters();
void FreeMonsters();
bool DirOK(int i, Direction mdir);
bool PosOkMissile(int entity, Point position);
bool PosOkMissile(Point position);
bool LineClearMissile(Point startPoint, Point endPoint);
bool LineClear(bool (*Clear)(int, Point), int entity, Point startPoint, Point endPoint);
bool LineClear(const std::function<bool(Point)> &clear, Point startPoint, Point endPoint);
void SyncMonsterAnim(MonsterStruct &monster);
void M_FallenFear(Point position);
void PrintMonstHistory(int mt);

Loading…
Cancel
Save