瀏覽代碼

Fixed type enum mismatch between Component and CComponent causing a crash when displaying w window with player flag.
Campaign against magic numbers.

Michał W. Urbańczyk 13 年之前
父節點
當前提交
3e346e737a
共有 2 個文件被更改,包括 29 次插入27 次删除
  1. 27 25
      lib/CObjectHandler.cpp
  2. 2 2
      lib/NetPacks.h

+ 27 - 25
lib/CObjectHandler.cpp

@@ -2519,7 +2519,8 @@ void CGVisitableOPH::treeSelected( int heroID, int resType, int resVal, expType
 }
 }
 void CGVisitableOPH::onNAHeroVisit(int heroID, bool alreadyVisited) const
 void CGVisitableOPH::onNAHeroVisit(int heroID, bool alreadyVisited) const
 {
 {
-	int id=0, subid=0, ot=0, sound = 0;
+	Component::EComponentType id = (Component::EComponentType)0;
+	int subid=0, ot=0, sound = 0;
 	expType val=1;
 	expType val=1;
 	switch(ID)
 	switch(ID)
 	{
 	{
@@ -2549,13 +2550,13 @@ void CGVisitableOPH::onNAHeroVisit(int heroID, bool alreadyVisited) const
 		break;
 		break;
 	case 100:
 	case 100:
 		sound = soundBase::gazebo;
 		sound = soundBase::gazebo;
-		id=5;
+		id=Component::EXPERIENCE;
 		ot=143;
 		ot=143;
 		val=1000;
 		val=1000;
 		break;
 		break;
 	case 102:
 	case 102:
 		sound = soundBase::gazebo;
 		sound = soundBase::gazebo;
-		id = 5;
+		id = Component::EXPERIENCE;
 		subid = 1;
 		subid = 1;
 		ot = 146;
 		ot = 146;
 		val = 1;
 		val = 1;
@@ -2582,8 +2583,8 @@ void CGVisitableOPH::onNAHeroVisit(int heroID, bool alreadyVisited) const
 				BlockingDialog sd(false,true);
 				BlockingDialog sd(false,true);
 				sd.soundID = sound;
 				sd.soundID = sound;
 				sd.text << std::pair<ui8,ui32>(11,ot);
 				sd.text << std::pair<ui8,ui32>(11,ot);
-				sd.components.push_back(Component(0,0,2,0));
-				sd.components.push_back(Component(0,1,2,0));
+				sd.components.push_back(Component(Component::PRIM_SKILL, PrimarySkill::ATTACK, 2, 0));
+				sd.components.push_back(Component(Component::PRIM_SKILL, PrimarySkill::DEFENSE, 2, 0));
 				sd.player = cb->getOwner(heroID);
 				sd.player = cb->getOwner(heroID);
 				cb->showBlockingDialog(&sd,boost::bind(&CGVisitableOPH::arenaSelected,this,heroID,_1));
 				cb->showBlockingDialog(&sd,boost::bind(&CGVisitableOPH::arenaSelected,this,heroID,_1));
 				return;
 				return;
@@ -2596,7 +2597,7 @@ void CGVisitableOPH::onNAHeroVisit(int heroID, bool alreadyVisited) const
 				cb->changePrimSkill(heroID,subid,val);
 				cb->changePrimSkill(heroID,subid,val);
 				InfoWindow iw;
 				InfoWindow iw;
 				iw.soundID = sound;
 				iw.soundID = sound;
-				iw.components.push_back(Component(0,subid,val,0));
+				iw.components.push_back(Component(Component::PRIM_SKILL, subid,val,0));
 				iw.text << std::pair<ui8,ui32>(11,ot);
 				iw.text << std::pair<ui8,ui32>(11,ot);
 				iw.player = cb->getOwner(heroID);
 				iw.player = cb->getOwner(heroID);
 				cb->showInfoDialog(&iw);
 				cb->showInfoDialog(&iw);
@@ -3429,7 +3430,7 @@ void CGMine::flagMine(ui8 player) const
 	iw.soundID = soundBase::FLAGMINE;
 	iw.soundID = soundBase::FLAGMINE;
 	iw.text.addTxt(MetaString::MINE_EVNTS,producedResource); //not use subID, abandoned mines uses default mine texts
 	iw.text.addTxt(MetaString::MINE_EVNTS,producedResource); //not use subID, abandoned mines uses default mine texts
 	iw.player = player;
 	iw.player = player;
-	iw.components.push_back(Component(2,producedResource,producedQuantity,-1));
+	iw.components.push_back(Component(Component::RESOURCE,producedResource,producedQuantity,-1));
 	cb->showInfoDialog(&iw);
 	cb->showInfoDialog(&iw);
 }
 }
 
 
@@ -3503,7 +3504,7 @@ void CGResource::collectRes( int player ) const
 	cb->giveResource(player,subID,amount);
 	cb->giveResource(player,subID,amount);
 	ShowInInfobox sii;
 	ShowInInfobox sii;
 	sii.player = player;
 	sii.player = player;
-	sii.c = Component(2,subID,amount,0);
+	sii.c = Component(Component::RESOURCE,subID,amount,0);
 	sii.text << std::pair<ui8,ui32>(11,113);
 	sii.text << std::pair<ui8,ui32>(11,113);
 	sii.text.addReplacement(MetaString::RES_NAMES, subID);
 	sii.text.addReplacement(MetaString::RES_NAMES, subID);
 	cb->showCompInfo(&sii);
 	cb->showCompInfo(&sii);
@@ -3572,8 +3573,9 @@ void CGVisitableOPW::onHeroVisit( const CGHeroInstance * h ) const
 	}
 	}
 	else
 	else
 	{
 	{
-		int type, sub=0, val=0;
-		type = 2;
+		Component::EComponentType type = Component::RESOURCE;
+		int sub=0, val=0;
+
 		switch (ID)
 		switch (ID)
 		{
 		{
 		case 55:
 		case 55:
@@ -3800,7 +3802,7 @@ void CGArtifact::onHeroVisit( const CGHeroInstance * h ) const
 		case 5:
 		case 5:
 			{
 			{
 				iw.soundID = soundBase::treasure; //play sound only for non-scroll arts
 				iw.soundID = soundBase::treasure; //play sound only for non-scroll arts
-				iw.components.push_back(Component(4,subID,0,0));
+				iw.components.push_back(Component(Component::ARTIFACT,subID,0,0));
 				if(message.length())
 				if(message.length())
 					iw.text <<  message;
 					iw.text <<  message;
 				else
 				else
@@ -3953,12 +3955,12 @@ void CGPickable::onHeroVisit( const CGHeroInstance * h ) const
 	case 12: //campfire
 	case 12: //campfire
 		{
 		{
 			cb->giveResource(h->tempOwner,type,val2); //non-gold resource
 			cb->giveResource(h->tempOwner,type,val2); //non-gold resource
-			cb->giveResource(h->tempOwner,6,val1);//gold
+			cb->giveResource(h->tempOwner,Res::GOLD,val1);//gold
 			InfoWindow iw;
 			InfoWindow iw;
 			iw.soundID = soundBase::experience;
 			iw.soundID = soundBase::experience;
 			iw.player = h->tempOwner;
 			iw.player = h->tempOwner;
-			iw.components.push_back(Component(2,6,val1,0));
-			iw.components.push_back(Component(2,type,val2,0));
+			iw.components.push_back(Component(Component::RESOURCE,Res::GOLD,val1,0));
+			iw.components.push_back(Component(Component::RESOURCE,type,val2,0));
 			iw.text << std::pair<ui8,ui32>(11,23);
 			iw.text << std::pair<ui8,ui32>(11,23);
 			cb->showInfoDialog(&iw);
 			cb->showInfoDialog(&iw);
 			break;
 			break;
@@ -3971,9 +3973,9 @@ void CGPickable::onHeroVisit( const CGHeroInstance * h ) const
 			iw.soundID = soundBase::GENIE;
 			iw.soundID = soundBase::GENIE;
 			iw.player = h->tempOwner;
 			iw.player = h->tempOwner;
 			if(val1)
 			if(val1)
-				iw.components.push_back(Component(2,0,val1,0));
+				iw.components.push_back(Component(Component::RESOURCE,Res::WOOD,val1,0));
 			if(val2)
 			if(val2)
-				iw.components.push_back(Component(2,6,val2,0));
+				iw.components.push_back(Component(Component::RESOURCE,Res::GOLD,val2,0));
 
 
 			iw.text.addTxt(MetaString::ADVOB_TXT, 51+type);
 			iw.text.addTxt(MetaString::ADVOB_TXT, 51+type);
 			cb->showInfoDialog(&iw);
 			cb->showInfoDialog(&iw);
@@ -3988,13 +3990,13 @@ void CGPickable::onHeroVisit( const CGHeroInstance * h ) const
 
 
 			if(val1) //there is gold
 			if(val1) //there is gold
 			{
 			{
-				iw.components.push_back(Component(2,6,val1,0));
+				iw.components.push_back(Component(Component::RESOURCE,Res::GOLD,val1,0));
 				cb->giveResource(h->tempOwner,6,val1);
 				cb->giveResource(h->tempOwner,6,val1);
 			}
 			}
 			if(type == 1) //art
 			if(type == 1) //art
 			{
 			{
 				//TODO: what if no space in backpack?
 				//TODO: what if no space in backpack?
-				iw.components.push_back(Component(4, val2, 1, 0));
+				iw.components.push_back(Component(Component::ARTIFACT, val2, 1, 0));
 				iw.text.addReplacement(MetaString::ART_NAMES, val2);
 				iw.text.addReplacement(MetaString::ART_NAMES, val2);
 				cb->giveHeroNewArtifact(h, VLC->arth->artifacts[val2],-2);
 				cb->giveHeroNewArtifact(h, VLC->arth->artifacts[val2],-2);
 			}
 			}
@@ -4007,7 +4009,7 @@ void CGPickable::onHeroVisit( const CGHeroInstance * h ) const
 			InfoWindow iw;
 			InfoWindow iw;
 			iw.soundID = soundBase::experience;
 			iw.soundID = soundBase::experience;
 			iw.player = h->tempOwner;
 			iw.player = h->tempOwner;
-			iw.components.push_back(Component(4,val1,1,0));
+			iw.components.push_back(Component(Component::ARTIFACT,val1,1,0));
 			iw.text.addTxt(MetaString::ADVOB_TXT, 125);
 			iw.text.addTxt(MetaString::ADVOB_TXT, 125);
 			iw.text.addReplacement(MetaString::ART_NAMES, val1);
 			iw.text.addReplacement(MetaString::ART_NAMES, val1);
 			cb->giveHeroNewArtifact(h, VLC->arth->artifacts[val1],-2);
 			cb->giveHeroNewArtifact(h, VLC->arth->artifacts[val1],-2);
@@ -4028,7 +4030,7 @@ void CGPickable::onHeroVisit( const CGHeroInstance * h ) const
 				InfoWindow iw;
 				InfoWindow iw;
 				iw.soundID = soundBase::treasure;
 				iw.soundID = soundBase::treasure;
 				iw.player = h->tempOwner;
 				iw.player = h->tempOwner;
-				iw.components.push_back(Component(4,val1,1,0));
+				iw.components.push_back(Component(Component::ARTIFACT,val1,1,0));
 				iw.text << std::pair<ui8,ui32>(11,145);
 				iw.text << std::pair<ui8,ui32>(11,145);
 				iw.text.addReplacement(MetaString::ART_NAMES, val1);
 				iw.text.addReplacement(MetaString::ART_NAMES, val1);
 				cb->showInfoDialog(&iw);
 				cb->showInfoDialog(&iw);
@@ -4039,9 +4041,9 @@ void CGPickable::onHeroVisit( const CGHeroInstance * h ) const
 				BlockingDialog sd(false,true);
 				BlockingDialog sd(false,true);
 				sd.player = h->tempOwner;
 				sd.player = h->tempOwner;
 				sd.text << std::pair<ui8,ui32>(11,146);
 				sd.text << std::pair<ui8,ui32>(11,146);
-				sd.components.push_back(Component(2,6,val1,0));
+				sd.components.push_back(Component(Component::RESOURCE,Res::GOLD,val1,0));
 				expType expVal = h->calculateXp(val2);
 				expType expVal = h->calculateXp(val2);
-				sd.components.push_back(Component(5,0,expVal, 0));
+				sd.components.push_back(Component(Component::EXPERIENCE,0,expVal, 0));
 				sd.soundID = soundBase::chest;
 				sd.soundID = soundBase::chest;
 				boost::function<void(ui32)> fun = boost::bind(&CGPickable::chosen,this,_1,h->id);
 				boost::function<void(ui32)> fun = boost::bind(&CGPickable::chosen,this,_1,h->id);
 				cb->showBlockingDialog(&sd,fun);
 				cb->showBlockingDialog(&sd,fun);
@@ -4769,7 +4771,7 @@ void CGWitchHut::onHeroVisit( const CGHeroInstance * h ) const
 	}
 	}
 	else //give sec skill
 	else //give sec skill
 	{
 	{
-		iw.components.push_back(Component(1, ability, 1, 0));
+		iw.components.push_back(Component(Component::SEC_SKILL, ability, 1, 0));
 		iw.text << std::pair<ui8,ui32>(11,171);
 		iw.text << std::pair<ui8,ui32>(11,171);
 		iw.text.addReplacement(MetaString::SEC_SKILL_NAME, ability);
 		iw.text.addReplacement(MetaString::SEC_SKILL_NAME, ability);
 		cb->changeSecSkill(h->id,ability,1,true);
 		cb->changeSecSkill(h->id,ability,1,true);
@@ -4960,9 +4962,9 @@ void CGBonusingObject::onHeroVisit( const CGHeroInstance * h ) const
 	{
 	{
 		//TODO: fix if second bonus val != main bonus val
 		//TODO: fix if second bonus val != main bonus val
 		if(gbonus.bonus.type == Bonus::MORALE   ||   secondBonus.type == Bonus::MORALE)
 		if(gbonus.bonus.type == Bonus::MORALE   ||   secondBonus.type == Bonus::MORALE)
-			iw.components.push_back(Component(8,0,gbonus.bonus.val,0));
+			iw.components.push_back(Component(Component::MORALE,0,gbonus.bonus.val,0));
 		if(gbonus.bonus.type == Bonus::LUCK   ||   secondBonus.type == Bonus::LUCK)
 		if(gbonus.bonus.type == Bonus::LUCK   ||   secondBonus.type == Bonus::LUCK)
-			iw.components.push_back(Component(9,0,gbonus.bonus.val,0));
+			iw.components.push_back(Component(Component::LUCK,0,gbonus.bonus.val,0));
 		cb->giveHeroBonus(&gbonus);
 		cb->giveHeroBonus(&gbonus);
 		if(second)
 		if(second)
 		{
 		{

+ 2 - 2
lib/NetPacks.h

@@ -1076,7 +1076,7 @@ struct NewTurn : public CPackForClient //101
 
 
 struct Component : public CPack //2002 helper for object scrips informations
 struct Component : public CPack //2002 helper for object scrips informations
 {
 {
-	enum EComponentType {PRIM_SKILL, SEC_SKILL, RESOURCE, CREATURE, ARTIFACT, EXPERIENCE, SPELL, MORALE=8, LUCK, BUILDING, HERO, FLAG};
+	enum EComponentType {PRIM_SKILL, SEC_SKILL, RESOURCE, CREATURE, ARTIFACT, EXPERIENCE, SPELL, MORALE, LUCK, BUILDING, HERO, FLAG};
 	ui16 id, subtype; //id uses ^^^ enums, when id==EXPPERIENCE subtype==0 means exp points and subtype==1 levels)
 	ui16 id, subtype; //id uses ^^^ enums, when id==EXPPERIENCE subtype==0 means exp points and subtype==1 levels)
 	si32 val; // + give; - take
 	si32 val; // + give; - take
 	si16 when; // 0 - now; +x - within x days; -x - per x days
 	si16 when; // 0 - now; +x - within x days; -x - per x days
@@ -1090,7 +1090,7 @@ struct Component : public CPack //2002 helper for object scrips informations
 		type = 2002;
 		type = 2002;
 	}
 	}
 	DLL_LINKAGE explicit Component(const CStackBasicDescriptor &stack);
 	DLL_LINKAGE explicit Component(const CStackBasicDescriptor &stack);
-	Component(ui16 Type, ui16 Subtype, si32 Val, si16 When)
+	Component(Component::EComponentType Type, ui16 Subtype, si32 Val, si16 When)
 		:id(Type),subtype(Subtype),val(Val),when(When)
 		:id(Type),subtype(Subtype),val(Val),when(When)
 	{
 	{
 		type = 2002;
 		type = 2002;