diff --git a/source/glest_game/gui/gui.cpp b/source/glest_game/gui/gui.cpp index 59fc1387..ad1467d7 100644 --- a/source/glest_game/gui/gui.cpp +++ b/source/glest_game/gui/gui.cpp @@ -349,7 +349,18 @@ void Gui::mouseDoubleClickLeftGraphics(int x, int y){ void Gui::groupKey(int groupIndex) { if(isKeyDown(vkControl)){ if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] groupIndex = %d\n",__FILE__,__FUNCTION__,__LINE__,groupIndex); - selection.assignGroup(groupIndex,!isKeyDown(vkShift)); + bool allAssigned=true; + bool clearGroup=!isKeyDown(vkShift); +// if(!clearGroup){ +// Unit* unit=selection.getFrontUnit(); +// if(unit!=null && unit->getType()->getMultiSelect()==false){ +// return; +// } +// } + allAssigned=selection.assignGroup(groupIndex,clearGroup); + if(!allAssigned){ + console->addStdMessage("GroupAssignFailed"); + } } else{ if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] groupIndex = %d\n",__FILE__,__FUNCTION__,__LINE__,groupIndex); diff --git a/source/glest_game/gui/selection.cpp b/source/glest_game/gui/selection.cpp index 69911923..721f8528 100644 --- a/source/glest_game/gui/selection.cpp +++ b/source/glest_game/gui/selection.cpp @@ -211,7 +211,7 @@ bool Selection::hasUnit(const Unit* unit) const { return find(selectedUnits.begin(), selectedUnits.end(), unit) != selectedUnits.end(); } -void Selection::assignGroup(int groupIndex, bool clearGroup,const UnitContainer *pUnits) { +bool Selection::assignGroup(int groupIndex, bool clearGroup,const UnitContainer *pUnits) { if(groupIndex < 0 || groupIndex >= maxGroups) { throw megaglest_runtime_error("Invalid value for groupIndex = " + intToStr(groupIndex)); } @@ -227,17 +227,40 @@ void Selection::assignGroup(int groupIndex, bool clearGroup,const UnitContainer addUnits = pUnits; } for(unsigned int i = 0; i < addUnits->size(); ++i) { - groups[groupIndex].push_back((*addUnits)[i]); + if(false == addUnitToGroup(groupIndex,(*addUnits)[i])){ + // don't try to add more, group is full + return false; + } } + return true; } -void Selection::addUnitToGroup(int groupIndex,Unit *unit) { +/** + * returns false if group is already full + */ +bool Selection::addUnitToGroup(int groupIndex,Unit *unit) { if(groupIndex < 0 || groupIndex >= maxGroups) { throw megaglest_runtime_error("Invalid value for groupIndex = " + intToStr(groupIndex)); } + bool alreadyExists=false; + bool groupIsFull=(int)groups[groupIndex].size() >= Config::getInstance().getInt("MaxUnitSelectCount",intToStr(maxUnits).c_str()); - if(unit != NULL) { + for(int i = 0; i < (int)groups[groupIndex].size(); ++i) { + if(groups[groupIndex][i] == unit) { + alreadyExists=true; + break; + } + } + + if(alreadyExists){ + return true; + } + else if(unit != NULL && !groupIsFull) { groups[groupIndex].push_back(unit); + return true; + } + else{ + return false; } } diff --git a/source/glest_game/gui/selection.h b/source/glest_game/gui/selection.h index 0c58cac9..5c2e6c65 100644 --- a/source/glest_game/gui/selection.h +++ b/source/glest_game/gui/selection.h @@ -89,8 +89,8 @@ public: Vec3f getRefPos() const; bool hasUnit(const Unit* unit) const; - void assignGroup(int groupIndex, bool clearGroup=true, const UnitContainer *pUnits=NULL); - void addUnitToGroup(int groupIndex,Unit *unit); + bool assignGroup(int groupIndex, bool clearGroup=true, const UnitContainer *pUnits=NULL); + bool addUnitToGroup(int groupIndex,Unit *unit); void removeUnitFromGroup(int groupIndex,int UnitId); void recallGroup(int groupIndex, bool clearSelection=true);