feat: standart for cammand grid
This commit is contained in:
parent
46d5904578
commit
f1e4a1bf83
|
@ -97,7 +97,6 @@ Gui::Gui(){
|
||||||
if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s] START\n",__FILE__,__FUNCTION__);
|
if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s] START\n",__FILE__,__FUNCTION__);
|
||||||
|
|
||||||
lastGroupRecall = -1;
|
lastGroupRecall = -1;
|
||||||
numberCommands=0;
|
|
||||||
posObjWorld= Vec2i(54, 14);
|
posObjWorld= Vec2i(54, 14);
|
||||||
validPosObjWorld= false;
|
validPosObjWorld= false;
|
||||||
activeCommandType= NULL;
|
activeCommandType= NULL;
|
||||||
|
@ -454,15 +453,11 @@ void Gui::hotKey(SDL_KeyboardEvent key) {
|
||||||
if(isKeyPressed(configKeys.getSDLKey(name.c_str()),key) == true) {
|
if(isKeyPressed(configKeys.getSDLKey(name.c_str()),key) == true) {
|
||||||
if(activeCommandType != NULL && activeCommandType->getClass() == ccBuild) {
|
if(activeCommandType != NULL && activeCommandType->getClass() == ccBuild) {
|
||||||
mouseDownDisplayUnitBuild(i);
|
mouseDownDisplayUnitBuild(i);
|
||||||
computeDisplay();
|
|
||||||
break;
|
|
||||||
} else {
|
} else {
|
||||||
if (i < numberCommands) {
|
mouseDownDisplayUnitSkills(i);
|
||||||
mouseDownDisplayUnitSkills(i);
|
|
||||||
computeDisplay();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
computeDisplay();
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -720,7 +715,7 @@ void Gui::mouseDownDisplayUnitSkills(int posDisplay) {
|
||||||
}
|
}
|
||||||
|
|
||||||
//give orders depending on command type
|
//give orders depending on command type
|
||||||
if(!selection.isEmpty()){
|
if(activeCommandClass != ccNull){
|
||||||
const CommandType *ct= selection.getUnit(0)->getType()->getFirstCtOfClass(activeCommandClass);
|
const CommandType *ct= selection.getUnit(0)->getType()->getFirstCtOfClass(activeCommandClass);
|
||||||
if (activeCommandClass == ccAttack) {
|
if (activeCommandClass == ccAttack) {
|
||||||
ct = selection.getUnitFromCC(ccAttack)->getType()->getFirstCtOfClass(activeCommandClass);
|
ct = selection.getUnitFromCC(ccAttack)->getType()->getFirstCtOfClass(activeCommandClass);
|
||||||
|
@ -737,7 +732,7 @@ void Gui::mouseDownDisplayUnitSkills(int posDisplay) {
|
||||||
selectingPos= true;
|
selectingPos= true;
|
||||||
activePos= posDisplay;
|
activePos= posDisplay;
|
||||||
}
|
}
|
||||||
}
|
} else { posDisplay= invalidPos;}
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
activePos= posDisplay;
|
activePos= posDisplay;
|
||||||
|
@ -994,10 +989,11 @@ void Gui::computeDisplay(){
|
||||||
if(u->isBuilt()){
|
if(u->isBuilt()){
|
||||||
//printf("u->isBuilt()\n");
|
//printf("u->isBuilt()\n");
|
||||||
|
|
||||||
int morphPos= 8;
|
int morphPos= CommandHelper::getMorphPos();
|
||||||
for(int i= 0; i < ut->getCommandTypeCount(); ++i){
|
for(int i= 0; i < ut->getCommandTypeSortedCount(); ++i){
|
||||||
int displayPos= i;
|
int displayPos= i;
|
||||||
const CommandType *ct= ut->getCommandType(i);
|
const CommandType *ct= ut->getCommandTypeSorted(i);
|
||||||
|
if(ct == NULL) continue;
|
||||||
if(ct->getClass() == ccMorph) {
|
if(ct->getClass() == ccMorph) {
|
||||||
displayPos= morphPos++;
|
displayPos= morphPos++;
|
||||||
}
|
}
|
||||||
|
@ -1040,38 +1036,38 @@ void Gui::computeDisplay(){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
numberCommands = displayPos;
|
|
||||||
}
|
}
|
||||||
numberCommands++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
//printf("selection.isUniform() == FALSE\n");
|
//printf("selection.isUniform() == FALSE\n");
|
||||||
//non uniform selection
|
//non uniform selection
|
||||||
int lastCommand= 0;
|
int basicPos= CommandHelper::getBasicPos();
|
||||||
for(int i= 0; i < ccCount; ++i){
|
// only basics can be shared
|
||||||
CommandClass cc= static_cast<CommandClass> (i);
|
for(auto &&cc : CommandHelper::getBasicsCC()){
|
||||||
|
|
||||||
//printf("computeDisplay i = %d cc = %d isshared = %d lastCommand = %d\n",i,cc,isSharedCommandClass(cc),lastCommand);
|
//printf("computeDisplay i = %d cc = %d isshared = %d basicPos = %d\n",i,cc,isSharedCommandClass(cc),basicPos);
|
||||||
|
|
||||||
const Unit* attackingUnit = NULL;
|
const Unit* attackingUnit = NULL;
|
||||||
if (cc == ccAttack) {
|
if (cc == ccAttack) {
|
||||||
attackingUnit = selection.getUnitFromCC(ccAttack);
|
attackingUnit = selection.getUnitFromCC(ccAttack);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto ccPos = CommandHelper::getBasicPos(cc);
|
||||||
|
|
||||||
if((cc == ccAttack && attackingUnit != NULL) || (isSharedCommandClass(cc) && cc != ccBuild)){
|
if((cc == ccAttack && attackingUnit != NULL) || (isSharedCommandClass(cc) && cc != ccBuild)){
|
||||||
display.setDownLighted(lastCommand, true);
|
display.setDownLighted(basicPos + ccPos, true);
|
||||||
|
|
||||||
if (cc == ccAttack && attackingUnit != NULL) {
|
if (cc == ccAttack && attackingUnit != NULL) {
|
||||||
display.setDownImage(lastCommand, attackingUnit->getType()->getFirstCtOfClass(cc)->getImage());
|
display.setDownImage(basicPos + ccPos, attackingUnit->getType()->getFirstCtOfClass(cc)->getImage());
|
||||||
} else {
|
} else {
|
||||||
display.setDownImage(lastCommand, ut->getFirstCtOfClass(cc)->getImage());
|
display.setDownImage(basicPos + ccPos, ut->getFirstCtOfClass(cc)->getImage());
|
||||||
}
|
}
|
||||||
|
display.setCommandClass(basicPos + ccPos, cc);
|
||||||
display.setCommandClass(lastCommand, cc);
|
display.setCommandClass(lastCommand, cc);
|
||||||
lastCommand++;
|
lastCommand++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
numberCommands = lastCommand;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (activeCommandType != NULL && activeCommandType->getClass() == ccBuild) {
|
else if (activeCommandType != NULL && activeCommandType->getClass() == ccBuild) {
|
||||||
|
|
|
@ -125,7 +125,6 @@ private:
|
||||||
CommandClass activeCommandClass;
|
CommandClass activeCommandClass;
|
||||||
int activePos;
|
int activePos;
|
||||||
int lastPosDisplay;
|
int lastPosDisplay;
|
||||||
int numberCommands;
|
|
||||||
|
|
||||||
//composite
|
//composite
|
||||||
Display display;
|
Display display;
|
||||||
|
|
|
@ -31,6 +31,20 @@ using namespace Shared::Util;
|
||||||
|
|
||||||
namespace Glest{ namespace Game{
|
namespace Glest{ namespace Game{
|
||||||
|
|
||||||
|
// =====================================================
|
||||||
|
// class CommandHelper
|
||||||
|
// =====================================================
|
||||||
|
|
||||||
|
int CommandHelper::getBasicPos(CommandClass cc){
|
||||||
|
switch(cc) {
|
||||||
|
case ccAttack: return 0; break;
|
||||||
|
case ccStop: return 1; break;
|
||||||
|
case ccMove: return 2; break;
|
||||||
|
case ccAttackStopped: return 3; break;
|
||||||
|
default:
|
||||||
|
return ccNull;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// =====================================================
|
// =====================================================
|
||||||
// class CommandType
|
// class CommandType
|
||||||
|
|
|
@ -66,6 +66,18 @@ enum Queueability {
|
||||||
qAlways
|
qAlways
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class CommandHelper {// TODO put magic numbers to settings
|
||||||
|
public:
|
||||||
|
inline static int getCorePos() { return 0; }
|
||||||
|
inline static int getBasicPos() { return 4; }
|
||||||
|
inline static int getMorphPos() { return 8; }
|
||||||
|
static int getBasicPos(CommandClass cc);
|
||||||
|
inline static vector<CommandClass> getBasicsCC() { return { ccAttack, ccStop, ccMove, ccAttackStopped }; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
CommandHelper(){ }
|
||||||
|
};
|
||||||
|
|
||||||
// =====================================================
|
// =====================================================
|
||||||
// class CommandType
|
// class CommandType
|
||||||
//
|
//
|
||||||
|
|
|
@ -880,6 +880,7 @@ void UnitType::loaddd(int id,const string &dir, const TechTree *techTree,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
sortCommandTypes(commandTypes);
|
||||||
|
|
||||||
computeFirstStOfClass();
|
computeFirstStOfClass();
|
||||||
computeFirstCtOfClass();
|
computeFirstCtOfClass();
|
||||||
|
@ -1236,6 +1237,78 @@ void UnitType::computeFirstCtOfClass() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void UnitType::sortCommandTypes(CommandTypes cts){
|
||||||
|
CommandTypes ctBuf(cts);
|
||||||
|
|
||||||
|
CommandTypes ctCores;
|
||||||
|
CommandTypes ctBasics = {NULL,NULL,NULL,NULL};
|
||||||
|
CommandTypes ctMorphs;
|
||||||
|
|
||||||
|
CommandTypes ctAttack;
|
||||||
|
CommandTypes ctBuild;
|
||||||
|
|
||||||
|
//Morphs
|
||||||
|
for(int i = (int)ctBuf.size(); i --> 0; ) {
|
||||||
|
if(ctBuf[i]->getClass() == ccMorph) {
|
||||||
|
ctMorphs.insert(ctMorphs.begin(), ctBuf[i]);
|
||||||
|
ctBuf.erase(ctBuf.begin() + i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Attacks
|
||||||
|
CommandTypeFilter(ctBuf, ctAttack, ccAttack);
|
||||||
|
if(ctAttack.size() > 0) {
|
||||||
|
ctBasics[0] = ctAttack[0];// first attack to basics
|
||||||
|
ctAttack.erase(ctAttack.begin());// another to cores
|
||||||
|
ctCores.insert(ctCores.end(), ctAttack.begin(), ctAttack.end());
|
||||||
|
}
|
||||||
|
auto basicsCC = CommandHelper::getBasicsCC();
|
||||||
|
// removing attack cuz we catch all attacks above
|
||||||
|
basicsCC.erase( basicsCC.begin() + CommandHelper::getBasicPos(ccAttack));
|
||||||
|
|
||||||
|
//Basics
|
||||||
|
for(int i = (int)ctBuf.size(); i --> 0; ) {
|
||||||
|
for(auto &&cc : basicsCC ){
|
||||||
|
if(ctBuf[i]->getClass() == cc) {
|
||||||
|
auto ccPos = CommandHelper::getBasicPos(cc);
|
||||||
|
ctBasics[ccPos] = ctBuf[i];
|
||||||
|
ctBuf.erase(ctBuf.begin() + i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// //Cores
|
||||||
|
CommandTypeFilter(ctBuf, ctCores, ccProduce);
|
||||||
|
CommandTypeFilter(ctBuf, ctCores, ccUpgrade);
|
||||||
|
CommandTypeFilter(ctBuf, ctCores, ccSwitchTeam);
|
||||||
|
CommandTypeFilter(ctBuf, ctCores, ccHarvest);
|
||||||
|
CommandTypeFilter(ctBuf, ctCores, ccRepair);
|
||||||
|
|
||||||
|
//Build
|
||||||
|
CommandTypeFilter(ctBuf, ctBuild, ccBuild);// Build position always 4 in cores
|
||||||
|
if(ctCores.size() == 4) {/*do nothing*/ }
|
||||||
|
else if(ctCores.size() < 4) {
|
||||||
|
int nullCount = 4 - ctCores.size();
|
||||||
|
for(int i=0; i<nullCount; i++){
|
||||||
|
ctCores.push_back(NULL);
|
||||||
|
}
|
||||||
|
if(ctBuild.size() > 0){
|
||||||
|
ctCores[3] = ctBuild[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
commandTypesSorted.insert(commandTypesSorted.end(), ctCores.begin(), ctCores.end());
|
||||||
|
commandTypesSorted.insert(commandTypesSorted.end(), ctBasics.begin(), ctBasics.end());
|
||||||
|
commandTypesSorted.insert(commandTypesSorted.end(), ctMorphs.begin(), ctMorphs.end());
|
||||||
|
}
|
||||||
|
|
||||||
|
void UnitType::CommandTypeFilter(CommandTypes &input, CommandTypes &output, CommandClass cc){
|
||||||
|
std::copy_if(input.begin(), input.end(), std::back_inserter(output), [cc](CommandType* i) {
|
||||||
|
if(i->getClass() == cc)
|
||||||
|
return true;
|
||||||
|
else return false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
const CommandType* UnitType::findCommandTypeById(int id) const{
|
const CommandType* UnitType::findCommandTypeById(int id) const{
|
||||||
const HarvestEmergencyReturnCommandType *result = dynamic_cast<const HarvestEmergencyReturnCommandType *>(ctHarvestEmergencyReturnCommandType.get());
|
const HarvestEmergencyReturnCommandType *result = dynamic_cast<const HarvestEmergencyReturnCommandType *>(ctHarvestEmergencyReturnCommandType.get());
|
||||||
if(result != NULL && id == result->getId()) {
|
if(result != NULL && id == result->getId()) {
|
||||||
|
@ -1260,6 +1333,15 @@ const CommandType *UnitType::getCommandType(int i) const {
|
||||||
return commandTypes[i];
|
return commandTypes[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const CommandType *UnitType::getCommandTypeSorted(int i) const {
|
||||||
|
if(i >= (int)commandTypesSorted.size()) {
|
||||||
|
char szBuf[8096]="";
|
||||||
|
snprintf(szBuf,8096,"In [%s::%s Line: %d] i >= commandTypesSorted.size(), i = %d, commandTypesSorted.size() = " MG_SIZE_T_SPECIFIER "",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,i,commandTypesSorted.size());
|
||||||
|
throw megaglest_runtime_error(szBuf);
|
||||||
|
}
|
||||||
|
return commandTypesSorted[i];
|
||||||
|
}
|
||||||
|
|
||||||
string UnitType::getCommandTypeListDesc() const {
|
string UnitType::getCommandTypeListDesc() const {
|
||||||
string desc = "Commands: ";
|
string desc = "Commands: ";
|
||||||
for(int i=0; i<getCommandTypeCount(); ++i){
|
for(int i=0; i<getCommandTypeCount(); ++i){
|
||||||
|
|
|
@ -215,6 +215,7 @@ private:
|
||||||
//info
|
//info
|
||||||
SkillTypes skillTypes;
|
SkillTypes skillTypes;
|
||||||
CommandTypes commandTypes;
|
CommandTypes commandTypes;
|
||||||
|
CommandTypes commandTypesSorted;
|
||||||
StoredResources storedResources;
|
StoredResources storedResources;
|
||||||
Levels levels;
|
Levels levels;
|
||||||
LootableResources lootableResources;
|
LootableResources lootableResources;
|
||||||
|
@ -273,10 +274,12 @@ public:
|
||||||
inline const ArmorType *getArmorType() const {return armorType;}
|
inline const ArmorType *getArmorType() const {return armorType;}
|
||||||
inline const SkillType *getSkillType(int i) const {return skillTypes[i];}
|
inline const SkillType *getSkillType(int i) const {return skillTypes[i];}
|
||||||
const CommandType *getCommandType(int i) const;
|
const CommandType *getCommandType(int i) const;
|
||||||
|
const CommandType *getCommandTypeSorted(int i) const;
|
||||||
inline const Level *getLevel(int i) const {return &levels[i];}
|
inline const Level *getLevel(int i) const {return &levels[i];}
|
||||||
const Level *getLevel(string name) const;
|
const Level *getLevel(string name) const;
|
||||||
inline int getSkillTypeCount() const {return (int)skillTypes.size();}
|
inline int getSkillTypeCount() const {return (int)skillTypes.size();}
|
||||||
inline int getCommandTypeCount() const {return (int)commandTypes.size();}
|
inline int getCommandTypeCount() const {return (int)commandTypes.size();}
|
||||||
|
inline int getCommandTypeSortedCount() const {return (int)commandTypesSorted.size();}
|
||||||
inline int getLevelCount() const {return (int)levels.size();}
|
inline int getLevelCount() const {return (int)levels.size();}
|
||||||
inline bool getLight() const {return light;}
|
inline bool getLight() const {return light;}
|
||||||
inline bool getRotationAllowed() const {return rotationAllowed;}
|
inline bool getRotationAllowed() const {return rotationAllowed;}
|
||||||
|
@ -361,6 +364,8 @@ public:
|
||||||
private:
|
private:
|
||||||
void computeFirstStOfClass();
|
void computeFirstStOfClass();
|
||||||
void computeFirstCtOfClass();
|
void computeFirstCtOfClass();
|
||||||
|
void sortCommandTypes(CommandTypes cts);
|
||||||
|
void CommandTypeFilter(CommandTypes &input, CommandTypes &output, CommandClass cc);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue