MegaGlest/source/glest_game/type_instances/command.h
Banestorm 35ff02052c
Remove command priority system
This was resulting in non-intuitive and surprising behaviour when queuing
commands. Removing this system results in Megaglest behaving more like
other RTS games.

For instance, the following are now possible and weren't previously:
- Queuing multiple attack ground commands to move along a specific path
attacking all enemies on the way.
- Queuing attack ground followed by hold position, which is a sensible
  thing to do if you want a unit to guard a specific area.
- Queuing a move command followed by a produce command, if you want to
  have your summoner summon a daemon at a specific location.

The behaviour of queuing the stop command is unchanged, and commands that
must be the last in the queue, such as morphing, are still properly replaced when something
else is queued.
2022-09-06 02:11:05 +04:00

102 lines
2.9 KiB
C++

// ==============================================================
// This file is part of Glest (www.glest.org)
//
// Copyright (C) 2001-2008 Martiño Figueroa
//
// You can redistribute this code and/or modify it under
// the terms of the GNU General Public License as published
// by the Free Software Foundation; either version 2 of the
// License, or (at your option) any later version
// ==============================================================
#ifndef _GLEST_GAME_COMMAND_H_
#define _GLEST_GAME_COMMAND_H_
#ifdef WIN32
#include <winsock2.h>
#include <winsock.h>
#endif
#include <cstdlib>
#include "unit.h"
#include "vec.h"
#include "game_constants.h"
#include "leak_dumper.h"
namespace Glest{ namespace Game{
using Shared::Graphics::Vec2i;
class CommandType;
enum CommandStateType {
cst_None,
cst_linkedUnit,
cst_EmergencyReturnResource
};
// =====================================================
// class Command
//
/// A unit command
// =====================================================
class Command {
private:
const CommandType *commandType;
Vec2i originalPos;
Vec2i pos;
UnitReference unitRef; //target unit, used to move and attack optionally
CardinalDir facing; // facing, for build command
const UnitType *unitType; //used for build
CommandStateType stateType;
int stateValue;
int unitCommandGroupId;
Command();
public:
//constructor
Command(const CommandType *ct, const Vec2i &pos=Vec2i(0));
Command(const CommandType *ct, Unit *unit);
Command(const CommandType *ct, const Vec2i &pos, const UnitType *unitType, CardinalDir facing);
virtual ~Command() {}
//get
inline const CommandType *getCommandType() const {return commandType;}
inline Vec2i getPos() const {return pos;}
inline Vec2i getOriginalPos() const {return originalPos;}
inline Unit* getUnit() const {return unitRef.getUnit();}
inline const UnitType* getUnitType() const {return unitType;}
inline CardinalDir getFacing() const {return facing;}
//set
void setCommandType(const CommandType *commandType);
void setPos(const Vec2i &pos);
//void setOriginalPos(const Vec2i &pos);
void setPosToOriginalPos();
void setUnit(Unit *unit);
inline void setStateType(CommandStateType value) { stateType = value; }
inline CommandStateType getStateType() const { return stateType; }
inline void setStateValue(int value) { stateValue = value; }
inline int getStateValue() const { return stateValue; }
inline void setUnitCommandGroupId(int value) { unitCommandGroupId = value; }
inline int getUnitCommandGroupId() const { return unitCommandGroupId; }
std::string toString(bool translatedValue) const;
void saveGame(XmlNode *rootNode, Faction *faction);
static Command * loadGame(const XmlNode *rootNode,const UnitType *ut,World *world);
Checksum getCRC();
};
}}//end namespace
#endif