Skip to content

Commit

Permalink
Put missile max range within missile movement
Browse files Browse the repository at this point in the history
Missiles that don't move shouldn't be concerned with range
  • Loading branch information
grantramsay committed Mar 3, 2020
1 parent 367c560 commit aaa6347
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 22 deletions.
5 changes: 0 additions & 5 deletions apps/freeablo/faworld/missile/missile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -100,11 +100,6 @@ namespace FAWorld::Missile
graphic->stop();
}

// Stop after max range is exceeded.
auto distance = (Vec2Fix(curPoint.x, curPoint.y) - Vec2Fix(mSrcPoint.x, mSrcPoint.y)).magnitude();
if (distance > mAttr.mMaxRange)
graphic->stop();

// Stop after "time to live" has expired.
if (graphic->getTicksSinceStarted() > mAttr.mTimeToLive)
graphic->stop();
Expand Down
7 changes: 3 additions & 4 deletions apps/freeablo/faworld/missile/missile.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,11 +54,11 @@ namespace FAWorld::Missile
typedef std::function<void(Missile& missile, MissileGraphic& graphic)> Method;

static void stationary(Missile& missile, MissileGraphic& graphic);
static Method linear(FixedPoint speed);
static Method linear(FixedPoint speed, FixedPoint maxRange);
static void hoverOverCreator(Missile& missile, MissileGraphic& graphic);

private:
static void linear(MissileGraphic& graphic, FixedPoint speed);
static void linear(Missile& missile, MissileGraphic& graphic, FixedPoint speed, FixedPoint maxRange);
};

class ActorEngagement
Expand All @@ -77,13 +77,12 @@ namespace FAWorld::Missile
class Attributes
{
public:
Attributes(Creation::Method creation, Movement::Method movement, ActorEngagement::Method actorEngagement, FixedPoint maxRange, Tick timeToLive);
Attributes(Creation::Method creation, Movement::Method movement, ActorEngagement::Method actorEngagement, Tick timeToLive);
static Attributes fromId(MissileId missileId);

const Missile::Creation::Method mCreation;
const Missile::Movement::Method mMovement;
const Missile::ActorEngagement::Method mActorEngagement;
const FixedPoint mMaxRange;
const Tick mTimeToLive;
};

Expand Down
18 changes: 8 additions & 10 deletions apps/freeablo/faworld/missile/missileattributes.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,34 +2,32 @@

namespace FAWorld::Missile
{
Missile::Attributes::Attributes(
Creation::Method creation, Movement::Method movement, ActorEngagement::Method actorEngagement, FixedPoint maxRange, Tick timeToLive)
: mCreation(creation), mMovement(movement), mActorEngagement(actorEngagement), mMaxRange(maxRange), mTimeToLive(timeToLive)
Missile::Attributes::Attributes(Creation::Method creation, Movement::Method movement, ActorEngagement::Method actorEngagement, Tick timeToLive)
: mCreation(creation), mMovement(movement), mActorEngagement(actorEngagement), mTimeToLive(timeToLive)
{
}

Missile::Attributes Missile::Attributes::fromId(MissileId missileId)
{
static FixedPoint maxRangeIgnore = FixedPoint::fromRawValue(INT64_MAX);
static Tick ttlIgnore = std::numeric_limits<Tick>::max();

switch (missileId)
{
case MissileId::arrow:
return Attributes(Creation::singleFrame16Direction, Movement::linear(30), ActorEngagement::damageEnemyAndStop, 15, ttlIgnore);
return Attributes(Creation::singleFrame16Direction, Movement::linear(30, 15), ActorEngagement::damageEnemyAndStop, ttlIgnore);
case MissileId::firebolt:
return Attributes(Creation::animated16Direction, Movement::linear(15), ActorEngagement::damageEnemyAndStop, 15, ttlIgnore);
return Attributes(Creation::animated16Direction, Movement::linear(15, 15), ActorEngagement::damageEnemyAndStop, ttlIgnore);
case MissileId::farrow:
case MissileId::larrow:
return Attributes(Creation::animated16Direction, Movement::linear(30), ActorEngagement::damageEnemyAndStop, 15, ttlIgnore);
return Attributes(Creation::animated16Direction, Movement::linear(30, 15), ActorEngagement::damageEnemyAndStop, ttlIgnore);
case MissileId::firewall:
case MissileId::firewalla:
case MissileId::firewallc:
return Attributes(Creation::firewall, Movement::stationary, ActorEngagement::damageEnemy, maxRangeIgnore, World::getTicksInPeriod(8));
return Attributes(Creation::firewall, Movement::stationary, ActorEngagement::damageEnemy, World::getTicksInPeriod(8));
case MissileId::manashield:
return Attributes(Creation::basicAnimated, Movement::hoverOverCreator, ActorEngagement::none, maxRangeIgnore, World::getTicksInPeriod(8));
return Attributes(Creation::basicAnimated, Movement::hoverOverCreator, ActorEngagement::none, World::getTicksInPeriod(8));
case MissileId::town:
return Attributes(Creation::townPortal, Movement::stationary, ActorEngagement::townPortal, maxRangeIgnore, ttlIgnore);
return Attributes(Creation::townPortal, Movement::stationary, ActorEngagement::townPortal, ttlIgnore);
default:
invalid_enum(MissileId, missileId);
}
Expand Down
12 changes: 9 additions & 3 deletions apps/freeablo/faworld/missile/missilemovement.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,21 @@ namespace FAWorld::Missile
{
void Missile::Movement::stationary(Missile&, MissileGraphic&) {}

Missile::Movement::Method Missile::Movement::linear(FixedPoint speed)
Missile::Movement::Method Missile::Movement::linear(FixedPoint speed, FixedPoint maxRange)
{
return [=](Missile&, MissileGraphic& graphic) { linear(graphic, speed); };
return [=](Missile& missile, MissileGraphic& graphic) { linear(missile, graphic, speed, maxRange); };
}

void Missile::Movement::linear(MissileGraphic& graphic, FixedPoint speed)
void Missile::Movement::linear(Missile& missile, MissileGraphic& graphic, FixedPoint speed, FixedPoint maxRange)
{
graphic.mCurPos.setFreeMovement();
graphic.mCurPos.update(speed / FixedPoint(World::ticksPerSecond));

// Stop after max range is exceeded.
auto curPoint = graphic.mCurPos.current();
auto distance = (Vec2Fix(curPoint.x, curPoint.y) - Vec2Fix(missile.mSrcPoint.x, missile.mSrcPoint.y)).magnitude();
if (distance > maxRange)
graphic.stop();
}

void Missile::Movement::hoverOverCreator(Missile& missile, MissileGraphic& graphic)
Expand Down

0 comments on commit aaa6347

Please sign in to comment.