small bugfix for handling morph commands in the UI (was not properly handling commandclass). Added validation to tell modders that we have a max if 6 morphs that can display in the UI

This commit is contained in:
Mark Vejvoda
2011-10-21 16:04:21 +00:00
parent af2e2a8930
commit c6d4e898a0
3 changed files with 53 additions and 20 deletions

View File

@@ -739,14 +739,14 @@ void Gui::computeDisplay(){
// ================ PART 1 ================ // ================ PART 1 ================
if(selection.isEmpty() && selectedResourceObject!=NULL){ if(selection.isEmpty() && selectedResourceObject != NULL) {
Resource *r = selectedResourceObject->getResource(); Resource *r = selectedResourceObject->getResource();
display.setTitle(r->getType()->getName()); display.setTitle(r->getType()->getName());
display.setText(lang.get("Amount")+ ": "+intToStr(r->getAmount())+" / "+intToStr(r->getType()->getDefResPerPatch())); display.setText(lang.get("Amount")+ ": "+intToStr(r->getAmount())+" / "+intToStr(r->getType()->getDefResPerPatch()));
//display.setProgressBar(r->); //display.setProgressBar(r->);
display.setUpImage(0, r->getType()->getImage()); display.setUpImage(0, r->getType()->getImage());
} }
else{ else {
//title, text and progress bar //title, text and progress bar
if(selection.getCount() == 1){ if(selection.getCount() == 1){
display.setTitle(selection.getFrontUnit()->getFullName()); display.setTitle(selection.getFrontUnit()->getFullName());
@@ -766,7 +766,9 @@ void Gui::computeDisplay(){
display.setDownSelectedPos(activePos); display.setDownSelectedPos(activePos);
} }
if(selection.isCommandable()){ //printf("computeDisplay selection.isCommandable() = %d\n",selection.isCommandable());
if(selection.isCommandable()) {
//printf("selection.isComandable()\n"); //printf("selection.isComandable()\n");
if(selectingBuilding == false){ if(selectingBuilding == false){
@@ -774,7 +776,7 @@ void Gui::computeDisplay(){
//cancel button //cancel button
const Unit *u= selection.getFrontUnit(); const Unit *u= selection.getFrontUnit();
const UnitType *ut= u->getType(); const UnitType *ut= u->getType();
if(selection.isCancelable()){ if(selection.isCancelable()) {
//printf("selection.isCancelable() commandcount = %d\n",selection.getUnit(0)->getCommandSize()); //printf("selection.isCancelable() commandcount = %d\n",selection.getUnit(0)->getCommandSize());
if(selection.getUnit(0)->getCommandSize() > 0){ if(selection.getUnit(0)->getCommandSize() > 0){
//printf("Current Command [%s]\n",selection.getUnit(0)->getCurrCommand()->toString().c_str()); //printf("Current Command [%s]\n",selection.getUnit(0)->getCurrCommand()->toString().c_str());
@@ -792,7 +794,10 @@ void Gui::computeDisplay(){
display.setDownLighted(meetingPointPos, true); display.setDownLighted(meetingPointPos, true);
} }
if(selection.isUniform()){
//printf("computeDisplay selection.isUniform() = %d\n",selection.isUniform());
if(selection.isUniform()) {
//printf("selection.isUniform()\n"); //printf("selection.isUniform()\n");
//uniform selection //uniform selection
@@ -803,11 +808,15 @@ void Gui::computeDisplay(){
for(int i= 0; i < ut->getCommandTypeCount(); ++i){ for(int i= 0; i < ut->getCommandTypeCount(); ++i){
int displayPos= i; int displayPos= i;
const CommandType *ct= ut->getCommandType(i); const CommandType *ct= ut->getCommandType(i);
if(ct->getClass() == ccMorph){ if(ct->getClass() == ccMorph) {
displayPos= morphPos++; displayPos= morphPos++;
} }
//printf("computeDisplay i = %d displayPos = %d morphPos = %d ct->getClass() = %d [%s]\n",i,displayPos,morphPos,ct->getClass(),ct->getName().c_str());
display.setDownImage(displayPos, ct->getImage()); display.setDownImage(displayPos, ct->getImage());
display.setCommandType(displayPos, ct); display.setCommandType(displayPos, ct);
display.setCommandClass(displayPos, ct->getClass());
display.setDownLighted(displayPos, u->getFaction()->reqsOk(ct)); display.setDownLighted(displayPos, u->getFaction()->reqsOk(ct));
} }
} }
@@ -819,6 +828,9 @@ void Gui::computeDisplay(){
int lastCommand= 0; int lastCommand= 0;
for(int i= 0; i < ccCount; ++i){ for(int i= 0; i < ccCount; ++i){
CommandClass cc= static_cast<CommandClass> (i); CommandClass cc= static_cast<CommandClass> (i);
//printf("computeDisplay i = %d cc = %d isshared = %d lastCommand = %d\n",i,cc,isSharedCommandClass(cc),lastCommand);
if(isSharedCommandClass(cc) && cc != ccBuild){ if(isSharedCommandClass(cc) && cc != ccBuild){
display.setDownLighted(lastCommand, true); display.setDownLighted(lastCommand, true);
display.setDownImage(lastCommand, ut->getFirstCtOfClass(cc)->getImage()); display.setDownImage(lastCommand, ut->getFirstCtOfClass(cc)->getImage());
@@ -857,46 +869,56 @@ void Gui::computeDisplay(){
int Gui::computePosDisplay(int x, int y){ int Gui::computePosDisplay(int x, int y){
int posDisplay= display.computeDownIndex(x, y); int posDisplay= display.computeDownIndex(x, y);
if(posDisplay<0 || posDisplay>=Display::downCellCount){ //printf("computePosDisplay x = %d y = %d posDisplay = %d Display::downCellCount = %d cc = %d ct = %p\n",x,y,posDisplay,Display::downCellCount,display.getCommandClass(posDisplay),display.getCommandType(posDisplay));
if(posDisplay < 0 || posDisplay >= Display::downCellCount) {
posDisplay= invalidPos; posDisplay= invalidPos;
//printf("In [%s:%s] Line: %d\n",__FILE__,__FUNCTION__,__LINE__);
} }
else if(selection.isCommandable()){ else if(selection.isCommandable()) {
if(posDisplay!=cancelPos){ if(posDisplay != cancelPos) {
if(posDisplay!=meetingPointPos){ if(posDisplay != meetingPointPos) {
if(!selectingBuilding){ if(selectingBuilding == false) {
//standard selection //standard selection
if(display.getCommandClass(posDisplay)==ccNull && display.getCommandType(posDisplay)==NULL){ if(display.getCommandClass(posDisplay) == ccNull && display.getCommandType(posDisplay) == NULL) {
posDisplay= invalidPos; posDisplay= invalidPos;
//printf("In [%s:%s] Line: %d\n",__FILE__,__FUNCTION__,__LINE__);
} }
} }
else{ else {
//building selection //building selection
if(activeCommandType!=NULL && activeCommandType->getClass()==ccBuild){ if(activeCommandType != NULL && activeCommandType->getClass() == ccBuild){
const BuildCommandType *bct= static_cast<const BuildCommandType*>(activeCommandType); const BuildCommandType *bct= static_cast<const BuildCommandType*>(activeCommandType);
if(posDisplay>=bct->getBuildingCount()){ if(posDisplay >= bct->getBuildingCount()) {
posDisplay= invalidPos; posDisplay= invalidPos;
//printf("In [%s:%s] Line: %d\n",__FILE__,__FUNCTION__,__LINE__);
} }
} }
} }
} }
else{ else{
//check meeting point //check meeting point
if(!selection.isMeetable()){ if(!selection.isMeetable()) {
posDisplay= invalidPos; posDisplay= invalidPos;
//printf("In [%s:%s] Line: %d\n",__FILE__,__FUNCTION__,__LINE__);
} }
} }
} }
else{ else {
//check cancel button //check cancel button
if(!selection.isCancelable()){ if(selection.isCancelable() == false) {
posDisplay= invalidPos; posDisplay= invalidPos;
//printf("In [%s:%s] Line: %d\n",__FILE__,__FUNCTION__,__LINE__);
} }
} }
} }
else{ else {
posDisplay= invalidPos; posDisplay= invalidPos;
//printf("In [%s:%s] Line: %d\n",__FILE__,__FUNCTION__,__LINE__);
} }
//printf("computePosDisplay returning = %d\n",posDisplay);
return posDisplay; return posDisplay;
} }

View File

@@ -97,9 +97,11 @@ class Gui : public ObjectStateInterface {
public: public:
static const int maxSelBuff= 128*5; static const int maxSelBuff= 128*5;
static const int upgradeDisplayIndex= 8; static const int upgradeDisplayIndex= 8;
static const int cancelPos= 15;
static const int meetingPointPos= 14; static const int meetingPointPos= 14;
static const int cancelPos= 15;
static const int imageCount= 16; static const int imageCount= 16;
static const int invalidPos= -1; static const int invalidPos= -1;
static const int doubleClickSelectionRadius= 20; static const int doubleClickSelectionRadius= 20;

View File

@@ -266,6 +266,7 @@ std::vector<std::string> FactionType::validateFactionType() {
} }
} }
int morphCommandCount = 0;
for(int j = 0; j < unitType.getCommandTypeCount(); ++j) { for(int j = 0; j < unitType.getCommandTypeCount(); ++j) {
const CommandType *cmdType = unitType.getCommandType(j); const CommandType *cmdType = unitType.getCommandType(j);
if(cmdType != NULL) { if(cmdType != NULL) {
@@ -362,6 +363,7 @@ std::vector<std::string> FactionType::validateFactionType() {
if(cmdType->getClass() == ccMorph) { if(cmdType->getClass() == ccMorph) {
const MorphCommandType *morph = dynamic_cast<const MorphCommandType *>(cmdType); const MorphCommandType *morph = dynamic_cast<const MorphCommandType *>(cmdType);
if(morph != NULL) { if(morph != NULL) {
morphCommandCount++;
const UnitType *morphUnit = morph->getMorphUnit(); const UnitType *morphUnit = morph->getMorphUnit();
// Now lets find the unit that we should be able to morph // Now lets find the unit that we should be able to morph
@@ -385,6 +387,13 @@ std::vector<std::string> FactionType::validateFactionType() {
} }
} }
const int maxMorphsAllowed = 6;
if(morphCommandCount > maxMorphsAllowed) {
char szBuf[4096]="";
sprintf(szBuf,"The Unit [%s] in Faction [%s] has more than %d morph commands which is too many to display in the UI!",unitType.getName().c_str(),this->getName().c_str(),maxMorphsAllowed);
results.push_back(szBuf);
}
// Check every unit's unit requirements to validate that for every unit-requirements // Check every unit's unit requirements to validate that for every unit-requirements
// we have the units required in the faction. // we have the units required in the faction.
for(int j = 0; j < unitType.getUnitReqCount(); ++j) { for(int j = 0; j < unitType.getUnitReqCount(); ++j) {