![Banestorm](/assets/img/avatar_default.png)
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.
102 lines
2.9 KiB
C++
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
|