Fix CUnit::RestoreOrder to remove invalid stocked order.

Make the check of Order validity more generic.
This commit is contained in:
Joris 2012-05-11 14:58:43 +02:00
parent 35ca59780b
commit 17540efd29
34 changed files with 133 additions and 6 deletions

View file

@ -185,6 +185,20 @@ void AnimateActionAttack(CUnit &unit, COrder &order)
return true;
}
/* virtual */ bool COrder_Attack::IsValid() const
{
if (Action == UnitActionAttack) {
if (this->HasGoal()) {
return this->GetGoal()->IsAlive();
} else {
return Map.Info.IsPointOnMap(this->goalPos);
}
} else {
Assert(Action == UnitActionAttackGround);
return Map.Info.IsPointOnMap(this->goalPos);
}
}
/* virtual */ PixelPos COrder_Attack::Show(const CViewport &vp, const PixelPos &lastScreenPos) const
{
PixelPos targetPos;

View file

@ -111,6 +111,11 @@ enum {
return true;
}
/* virtual */ bool COrder_Board::IsValid() const
{
return this->HasGoal() && this->GetGoal()->IsAliveOnMap();
}
/* virtual */ PixelPos COrder_Board::Show(const CViewport &vp, const PixelPos &lastScreenPos) const
{
PixelPos targetPos;

View file

@ -45,6 +45,7 @@
#include "ai.h"
#include "animation.h"
#include "iolib.h"
#include "map.h"
#include "pathfinder.h"
#include "player.h"
#include "script.h"
@ -72,6 +73,8 @@ enum {
/* static */ COrder *COrder::NewActionBuild(const CUnit &builder, const Vec2i &pos, CUnitType &building)
{
Assert(Map.Info.IsPointOnMap(pos));
COrder_Build *order = new COrder_Build;
order->goalPos = pos;
@ -140,6 +143,11 @@ enum {
return true;
}
/* virtual */ bool COrder_Build::IsValid() const
{
return true;
}
/* virtual */ PixelPos COrder_Build::Show(const CViewport &vp, const PixelPos &lastScreenPos) const
{
PixelPos targetPos = vp.TilePosToScreen_TopLeft(this->goalPos);

View file

@ -123,6 +123,11 @@ extern void AiReduceMadeInBuilt(PlayerAi &pai, const CUnitType &type);
return true;
}
/* virtual */ bool COrder_Built::IsValid() const
{
return true;
}
/* virtual */ PixelPos COrder_Built::Show(const CViewport & , const PixelPos &lastScreenPos) const
{
return lastScreenPos;

View file

@ -68,6 +68,11 @@
return false;
}
/* virtual */ bool COrder_Die::IsValid() const
{
return true;
}
/* virtual */ PixelPos COrder_Die::Show(const CViewport & , const PixelPos &lastScreenPos) const
{
return lastScreenPos;

View file

@ -118,6 +118,11 @@ enum {
return true;
}
/* virtual */ bool COrder_Follow::IsValid() const
{
return true;
}
/* virtual */ PixelPos COrder_Follow::Show(const CViewport &vp, const PixelPos &lastScreenPos) const
{
PixelPos targetPos;

View file

@ -97,6 +97,11 @@
return true;
}
/* virtual */ bool COrder_Move::IsValid() const
{
return true;
}
/* virtual */ PixelPos COrder_Move::Show(const CViewport &vp, const PixelPos &lastScreenPos) const
{
const PixelPos targetPos = vp.TilePosToScreen_Center(this->goalPos);

View file

@ -110,6 +110,11 @@
return true;
}
/* virtual */ bool COrder_Patrol::IsValid() const
{
return true;
}
/* virtual */ PixelPos COrder_Patrol::Show(const CViewport &vp, const PixelPos &lastScreenPos) const
{
const PixelPos pos1 = vp.TilePosToScreen_Center(this->goalPos);

View file

@ -129,8 +129,10 @@
return true;
}
/* virtual */ bool COrder_Repair::IsValid() const
{
return true;
}
/* virtual */ PixelPos COrder_Repair::Show(const CViewport &vp, const PixelPos &lastScreenPos) const
{

View file

@ -97,7 +97,10 @@
return true;
}
/* virtual */ bool COrder_Research::IsValid() const
{
return true;
}
/* virtual */ PixelPos COrder_Research::Show(const CViewport & , const PixelPos &lastScreenPos) const
{

View file

@ -254,6 +254,11 @@ COrder_Resource::~COrder_Resource()
return true;
}
/* virtual */ bool COrder_Resource::IsValid() const
{
return true;
}
/* virtual */ PixelPos COrder_Resource::Show(const CViewport &vp, const PixelPos &lastScreenPos) const
{
PixelPos targetPos;

View file

@ -134,6 +134,11 @@
return true;
}
/* virtual */ bool COrder_SpellCast::IsValid() const
{
return true;
}
/* virtual */ PixelPos COrder_SpellCast::Show(const CViewport &vp, const PixelPos &lastScreenPos) const
{
PixelPos targetPos;

View file

@ -104,6 +104,11 @@ enum {
return true;
}
/* virtual */ bool COrder_Still::IsValid() const
{
return true;
}
/* virtual */ PixelPos COrder_Still::Show(const CViewport & , const PixelPos &lastScreenPos) const
{
if (this->Action == UnitActionStandGround) {

View file

@ -97,6 +97,11 @@
return true;
}
/* virtual */ bool COrder_Train::IsValid() const
{
return true;
}
/* virtual */ PixelPos COrder_Train::Show(const CViewport & , const PixelPos &lastScreenPos) const
{
return lastScreenPos;

View file

@ -96,6 +96,11 @@
return true;
}
/* virtual */ bool COrder_Unload::IsValid() const
{
return true;
}
/* virtual */ PixelPos COrder_Unload::Show(const CViewport &vp, const PixelPos &lastScreenPos) const
{
const PixelPos targetPos = vp.TilePosToScreen_Center(this->goalPos);

View file

@ -188,6 +188,12 @@ static int TransformUnitIntoType(CUnit &unit, const CUnitType &newtype)
return true;
}
/* virtual */ bool COrder_TransformInto::IsValid() const
{
return true;
}
/* virtual */ PixelPos COrder_TransformInto::Show(const CViewport & , const PixelPos &lastScreenPos) const
{
return lastScreenPos;
@ -233,6 +239,11 @@ static int TransformUnitIntoType(CUnit &unit, const CUnitType &newtype)
return true;
}
/* virtual */ bool COrder_UpgradeTo::IsValid() const
{
return true;
}
/* virtual */ PixelPos COrder_UpgradeTo::Show(const CViewport & , const PixelPos &lastScreenPos) const
{
return lastScreenPos;

View file

@ -48,6 +48,7 @@ public:
virtual COrder_Attack *Clone() const { return new COrder_Attack(*this); }
virtual bool IsValid() const;
virtual void Save(CFile &file, const CUnit &unit) const;
virtual bool ParseSpecificData(lua_State *l, int &j, const char *value, const CUnit &unit);

View file

@ -45,6 +45,8 @@ public:
virtual COrder_Board *Clone() const { return new COrder_Board(*this); }
virtual bool IsValid() const;
virtual void Save(CFile &file, const CUnit &unit) const;
virtual bool ParseSpecificData(lua_State *l, int &j, const char *value, const CUnit &unit);

View file

@ -45,6 +45,8 @@ public:
virtual COrder_Build *Clone() const { return new COrder_Build(*this); }
virtual bool IsValid() const;
virtual void Save(CFile &file, const CUnit &unit) const;
virtual bool ParseSpecificData(lua_State *l, int &j, const char *value, const CUnit &unit);

View file

@ -42,6 +42,8 @@ public:
virtual COrder_Built *Clone() const { return new COrder_Built(*this); }
virtual bool IsValid() const;
virtual void Save(CFile &file, const CUnit &unit) const;
virtual bool ParseSpecificData(lua_State *l, int &j, const char *value, const CUnit &unit);

View file

@ -44,6 +44,8 @@ public:
virtual void Save(CFile &file, const CUnit &unit) const;
virtual bool ParseSpecificData(lua_State *l, int &j, const char *value, const CUnit &unit);
virtual bool IsValid() const;
virtual void Execute(CUnit &unit);
virtual PixelPos Show(const CViewport &vp, const PixelPos &lastScreenPos) const;
virtual void UpdatePathFinderData(PathFinderInput &input) { UpdatePathFinderData_NotCalled(input); }

View file

@ -45,6 +45,8 @@ public:
virtual COrder_Follow *Clone() const { return new COrder_Follow(*this); }
virtual bool IsValid() const;
virtual void Save(CFile &file, const CUnit &unit) const;
virtual bool ParseSpecificData(lua_State *l, int &j, const char *value, const CUnit &unit);

View file

@ -45,6 +45,8 @@ public:
virtual COrder_Move *Clone() const { return new COrder_Move(*this); }
virtual bool IsValid() const;
virtual void Save(CFile &file, const CUnit &unit) const;
virtual bool ParseSpecificData(lua_State *l, int &j, const char *value, const CUnit &unit);

View file

@ -45,6 +45,8 @@ public:
virtual COrder_Patrol *Clone() const { return new COrder_Patrol(*this); }
virtual bool IsValid() const;
virtual void Save(CFile &file, const CUnit &unit) const;
virtual bool ParseSpecificData(lua_State *l, int &j, const char *value, const CUnit &unit);

View file

@ -46,6 +46,8 @@ public:
virtual COrder_Repair *Clone() const { return new COrder_Repair(*this); }
virtual bool IsValid() const;
virtual void Save(CFile &file, const CUnit &unit) const;
virtual bool ParseSpecificData(lua_State *l, int &j, const char *value, const CUnit &unit);

View file

@ -41,6 +41,8 @@ public:
virtual COrder_Research *Clone() const { return new COrder_Research(*this); }
virtual bool IsValid() const;
virtual void Save(CFile &file, const CUnit &unit) const;
virtual bool ParseSpecificData(lua_State *l, int &j, const char *value, const CUnit &unit);

View file

@ -51,6 +51,8 @@ public:
virtual COrder_Resource *Clone() const { return new COrder_Resource(*this); }
virtual bool IsValid() const;
virtual void Save(CFile &file, const CUnit &unit) const;
virtual bool ParseSpecificData(lua_State *l, int &j, const char *value, const CUnit &unit);

View file

@ -45,6 +45,8 @@ public:
virtual COrder_SpellCast *Clone() const { return new COrder_SpellCast(*this); }
virtual bool IsValid() const;
virtual void Save(CFile &file, const CUnit &unit) const;
virtual bool ParseSpecificData(lua_State *l, int &j, const char *value, const CUnit &unit);

View file

@ -41,6 +41,8 @@ public:
virtual COrder_Still *Clone() const { return new COrder_Still(*this); }
virtual bool IsValid() const;
virtual void Save(CFile &file, const CUnit &unit) const;
virtual bool ParseSpecificData(lua_State *l, int &j, const char *value, const CUnit &unit);

View file

@ -42,6 +42,8 @@ public:
virtual COrder_Train *Clone() const { return new COrder_Train(*this); }
virtual bool IsValid() const;
virtual void Save(CFile &file, const CUnit &unit) const;
virtual bool ParseSpecificData(lua_State *l, int &j, const char *value, const CUnit &unit);

View file

@ -45,6 +45,8 @@ public:
virtual COrder_Unload *Clone() const { return new COrder_Unload(*this); }
virtual bool IsValid() const;
virtual void Save(CFile &file, const CUnit &unit) const;
virtual bool ParseSpecificData(lua_State *l, int &j, const char *value, const CUnit &unit);

View file

@ -42,6 +42,8 @@ public:
virtual COrder_TransformInto *Clone() const { return new COrder_TransformInto(*this); }
virtual bool IsValid() const;
virtual void Save(CFile &file, const CUnit &unit) const;
virtual bool ParseSpecificData(lua_State *l, int &j, const char *value, const CUnit &unit);
@ -62,6 +64,8 @@ public:
virtual COrder_UpgradeTo *Clone() const { return new COrder_UpgradeTo(*this); }
virtual bool IsValid() const;
virtual void Save(CFile &file, const CUnit &unit) const;
virtual bool ParseSpecificData(lua_State *l, int &j, const char *value, const CUnit &unit);

View file

@ -106,6 +106,7 @@ public:
virtual COrder *Clone() const = 0;
virtual void Execute(CUnit &unit) = 0;
virtual void Cancel(CUnit &unit) {}
virtual bool IsValid() const = 0;
virtual PixelPos Show(const CViewport &vp, const PixelPos &lastScreenPos) const = 0;

View file

@ -369,9 +369,9 @@ bool CUnit::RestoreOrder()
{
COrder *savedOrder = this->SavedOrder;
if (savedOrder == NULL
|| (savedOrder->Action == UnitActionAttack
&& (!savedOrder->HasGoal() || savedOrder->GetGoal()->IsAlive()))) {
if (savedOrder == NULL || savedOrder->IsValid() == false) {
delete this->SavedOrder;
this->SavedOrder = NULL;
return false;
}