Fix CUnit::RestoreOrder to remove invalid stocked order.
Make the check of Order validity more generic.
This commit is contained in:
parent
35ca59780b
commit
17540efd29
34 changed files with 133 additions and 6 deletions
src
action
action_attack.cppaction_board.cppaction_build.cppaction_built.cppaction_die.cppaction_follow.cppaction_move.cppaction_patrol.cppaction_repair.cppaction_research.cppaction_resource.cppaction_spellcast.cppaction_still.cppaction_train.cppaction_unload.cppaction_upgradeto.cpp
include
action
action_attack.haction_board.haction_build.haction_built.haction_die.haction_follow.haction_move.haction_patrol.haction_repair.haction_research.haction_resource.haction_spellcast.haction_still.haction_train.haction_unload.haction_upgradeto.h
actions.hunit
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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); }
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue