mirror of
				https://github.com/vcmi/vcmi.git
				synced 2025-10-31 00:07:39 +02:00 
			
		
		
		
	Partial fix for 37. Full fix for 27, 64, 600. Fix for bug where code tried to reload non existent file.
This commit is contained in:
		| @@ -56,7 +56,7 @@ using namespace CSDL_Ext; | ||||
|  | ||||
| CAdvMapInt *adventureInt; | ||||
|  | ||||
| CMinimap::CMinimap(bool draw) | ||||
| CMinimap::CMinimap() | ||||
| { | ||||
| 	OBJ_CONSTRUCTION_CAPTURING_ALL; | ||||
| 	used = LCLICK | RCLICK | HOVER; | ||||
| @@ -93,39 +93,29 @@ CMinimap::CMinimap(bool draw) | ||||
| 		vinya.second.unused = 255; | ||||
| 		colorsBlocked.insert(vinya); | ||||
| 	} | ||||
|  | ||||
| 	if (draw) | ||||
| 		redraw(); | ||||
| } | ||||
|  | ||||
| CMinimap::~CMinimap() | ||||
| { | ||||
| 	SDL_FreeSurface(temps); | ||||
| 	 | ||||
| 	for(int g=0; g<map.size(); ++g) | ||||
| 		SDL_FreeSurface(map[g]); | ||||
| 	map.clear(); | ||||
|  | ||||
| 	for(int g=0; g<FoW.size(); ++g) | ||||
| 		SDL_FreeSurface(FoW[g]); | ||||
| 	FoW.clear(); | ||||
|  | ||||
| 	for(int g=0; g<flObjs.size(); ++g) | ||||
| 		SDL_FreeSurface(flObjs[g]); | ||||
| 	flObjs.clear(); | ||||
| 	for (std::map<int, CMinimapSurfacesRef>::iterator it = surfs.begin(); it != surfs.end(); ++it) | ||||
| 	{ | ||||
| 		it->second.free(); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void CMinimap::draw(SDL_Surface * to) | ||||
| { | ||||
| 	int player = adventureInt->player; | ||||
| 	if(LOCPLINT->makingTurn) | ||||
| 	{ | ||||
| 		int3 mapSizes = LOCPLINT->cb->getMapSize(); | ||||
| 		//draw terrain | ||||
| 		blitAt(map[adventureInt->position.z],0,0,temps); | ||||
| 		blitAt(surfs[player].map()[adventureInt->position.z],0,0,temps); | ||||
|  | ||||
| 		//draw heroes | ||||
| 		std::vector <const CGHeroInstance *> hh = LOCPLINT->cb->getHeroesInfo(false); | ||||
| 		int mw = map[0]->w, mh = map[0]->h, | ||||
| 		int mw = surfs[player].map()[0]->w, mh = surfs[player].map()[0]->h, | ||||
| 			wo = mw/mapSizes.x, ho = mh/mapSizes.y; | ||||
|  | ||||
| 		for (size_t i=0; i < hh.size(); ++i) | ||||
| @@ -145,9 +135,9 @@ void CMinimap::draw(SDL_Surface * to) | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		blitAt(flObjs[adventureInt->position.z],0,0,temps); | ||||
| 		blitAt(surfs[player].flObjs()[adventureInt->position.z],0,0,temps); | ||||
|  | ||||
| 		blitAt(FoW[adventureInt->position.z],0,0,temps); | ||||
| 		blitAt(surfs[player].FoW()[adventureInt->position.z],0,0,temps); | ||||
|  | ||||
| 		//draw radar | ||||
| 		const int tilesw=(ADVOPT.advmapW+31)/32; | ||||
| @@ -167,8 +157,15 @@ void CMinimap::draw(SDL_Surface * to) | ||||
| 		aiShield->showAll(to); | ||||
| 	} | ||||
| } | ||||
| void CMinimap::redraw(int level)// (level==-1) => redraw all levels | ||||
|  | ||||
| CMinimapSurfacesRef::CMinimapSurfacesRef() : ready(false) | ||||
| { | ||||
| } | ||||
|  | ||||
|  | ||||
| void CMinimapSurfacesRef::redraw(int level) | ||||
| { | ||||
| 	ready = true; | ||||
| 	initMap(level); | ||||
|  | ||||
| 	//FoW | ||||
| @@ -181,29 +178,31 @@ void CMinimap::redraw(int level)// (level==-1) => redraw all levels | ||||
| 	showVisibleTiles(); | ||||
| } | ||||
|  | ||||
| void CMinimap::initMap(int level) | ||||
| void CMinimapSurfacesRef::initMap(int level) | ||||
| { | ||||
| 	/*for(int g=0; g<map.size(); ++g) | ||||
| 	{ | ||||
| 		SDL_FreeSurface(map[g]); | ||||
| 	} | ||||
| 	map.clear();*/ | ||||
|  | ||||
| 	const Rect &minimap_pos = adventureInt->minimap.pos; | ||||
| 	std::map<int,SDL_Color> &colors = adventureInt->minimap.colors; | ||||
| 	std::map<int,SDL_Color> &colorsBlocked = adventureInt->minimap.colorsBlocked; | ||||
| 	int3 mapSizes = LOCPLINT->cb->getMapSize(); | ||||
| 	for (size_t i=0; i<CGI->mh->sizes.z; i++) | ||||
| 	{ | ||||
| 		SDL_Surface * pom ; | ||||
| 		SDL_Surface *pom; | ||||
| 		if ((level>=0) && (i!=level)) | ||||
| 			continue; | ||||
| 		if (map.size()<i+1) | ||||
| 			pom = CSDL_Ext::newSurface(pos.w,pos.h,screen); | ||||
| 		else pom = map[i]; | ||||
| 		for (int x=0;x<pos.w;x++) | ||||
| 		if (map_.size()<i+1) | ||||
| 			pom = CSDL_Ext::newSurface(minimap_pos.w,minimap_pos.h,screen); | ||||
| 		else pom = map_[i]; | ||||
| 		for (int x=0;x<minimap_pos.w;x++) | ||||
| 		{ | ||||
| 			for (int y=0;y<pos.h;y++) | ||||
| 			for (int y=0;y<minimap_pos.h;y++) | ||||
| 			{ | ||||
| 				int mx=(mapSizes.x*x)/pos.w; | ||||
| 				int my=(mapSizes.y*y)/pos.h; | ||||
| 				int mx=(mapSizes.x*x)/minimap_pos.w; | ||||
| 				int my=(mapSizes.y*y)/minimap_pos.h; | ||||
| 				const TerrainTile * tile = LOCPLINT->cb->getTile(int3(mx, my, i), false); | ||||
| 				if(tile) | ||||
| 				{ | ||||
| @@ -213,12 +212,12 @@ void CMinimap::initMap(int level) | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 		map.push_back(pom); | ||||
| 		map_.push_back(pom); | ||||
|  | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void CMinimap::initFoW(int level) | ||||
| void CMinimapSurfacesRef::initFoW(int level) | ||||
| { | ||||
| 	/*for(int g=0; g<FoW.size(); ++g) | ||||
| 	{ | ||||
| @@ -226,14 +225,15 @@ void CMinimap::initFoW(int level) | ||||
| 	} | ||||
| 	FoW.clear();*/ | ||||
|  | ||||
| 	const Rect &minimap_pos = adventureInt->minimap.pos; | ||||
| 	int3 mapSizes = LOCPLINT->cb->getMapSize(); | ||||
| 	int mw = map[0]->w, mh = map[0]->h;//, | ||||
| 	int mw = map_[0]->w, mh = map_[0]->h;//, | ||||
| 		//wo = mw/mapSizes.x, ho = mh/mapSizes.y; //TODO use me | ||||
| 	for(int d=0; d<CGI->mh->map->twoLevel+1; ++d) | ||||
| 	{ | ||||
| 		if(level>=0 && d!=level) | ||||
| 			continue; | ||||
| 		SDL_Surface * pt = CSDL_Ext::newSurface(pos.w, pos.h, CSDL_Ext::std32bppSurface); | ||||
| 		SDL_Surface * pt = CSDL_Ext::newSurface(minimap_pos.w, minimap_pos.h, CSDL_Ext::std32bppSurface); | ||||
| 		for (int i=0; i<mw; i++) | ||||
| 		{ | ||||
| 			for (int j=0; j<mh; j++) | ||||
| @@ -245,11 +245,11 @@ void CMinimap::initFoW(int level) | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 		FoW.push_back(pt); | ||||
| 		FoW_.push_back(pt); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void CMinimap::initFlaggableObjs(int level) | ||||
| void CMinimapSurfacesRef::initFlaggableObjs(int level) | ||||
| { | ||||
| 	/*for(int g=0; g<flObjs.size(); ++g) | ||||
| 	{ | ||||
| @@ -257,13 +257,14 @@ void CMinimap::initFlaggableObjs(int level) | ||||
| 	} | ||||
| 	flObjs.clear();*/ | ||||
|  | ||||
| 	const Rect &minimap_pos = adventureInt->minimap.pos; | ||||
| 	int3 mapSizes = LOCPLINT->cb->getMapSize(); | ||||
| 	int mw = map[0]->w, mh = map[0]->h; | ||||
| 	int mw = map_[0]->w, mh = map_[0]->h; | ||||
| 	for(int d=0; d<CGI->mh->map->twoLevel+1; ++d) | ||||
| 	{ | ||||
| 		if(level>=0 && d!=level) | ||||
| 			continue; | ||||
| 		SDL_Surface * pt = CSDL_Ext::newSurface(pos.w, pos.h, CSDL_Ext::std32bppSurface); | ||||
| 		SDL_Surface * pt = CSDL_Ext::newSurface(minimap_pos.w, minimap_pos.h, CSDL_Ext::std32bppSurface); | ||||
| 		for (int i=0; i<mw; i++) | ||||
| 		{ | ||||
| 			for (int j=0; j<mh; j++) | ||||
| @@ -271,7 +272,7 @@ void CMinimap::initFlaggableObjs(int level) | ||||
| 				CSDL_Ext::SDL_PutPixelWithoutRefresh(pt,i,j,0,0,0,0); | ||||
| 			} | ||||
| 		} | ||||
| 		flObjs.push_back(pt); | ||||
| 		flObjs_.push_back(pt); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @@ -287,7 +288,7 @@ void CMinimap::clickLeft(tribool down, bool previousState) | ||||
| { | ||||
| 	if (down && !(used & MOVE)) | ||||
| 		changeUsedEvents(MOVE, true); | ||||
| 	else if (!down  &&  used & MOVE) | ||||
| 	else if (!down	&&	used & MOVE) | ||||
| 		changeUsedEvents(MOVE, false); | ||||
|  | ||||
| 	//ClickableL::clickLeft(down); | ||||
| @@ -330,8 +331,46 @@ void CMinimap::deactivate() | ||||
| 	CIntObject::deactivate(); | ||||
| } | ||||
|  | ||||
| std::vector<SDL_Surface*> & CMinimapSurfacesRef::map() | ||||
| { | ||||
| 	if (!ready) redraw(); | ||||
| 	return map_; | ||||
| } | ||||
| std::vector<SDL_Surface*> & CMinimapSurfacesRef::FoW() | ||||
| { | ||||
| 	if (!ready) redraw(); | ||||
| 	return FoW_; | ||||
| } | ||||
| std::vector<SDL_Surface*> & CMinimapSurfacesRef::flObjs() | ||||
| { | ||||
| 	if (!ready) redraw(); | ||||
| 	return flObjs_; | ||||
| } | ||||
|  | ||||
| void CMinimapSurfacesRef::free() | ||||
| { | ||||
| 	if (ready) | ||||
| 	{ | ||||
| 		for (int g = 0; g < map_.size(); ++g) | ||||
| 			SDL_FreeSurface(map_[g]); | ||||
| 		map_.clear(); | ||||
| 	 | ||||
| 		for (int g = 0; g < FoW_.size(); ++g) | ||||
| 			SDL_FreeSurface(FoW_[g]); | ||||
| 		FoW_.clear(); | ||||
| 	 | ||||
| 		for (int g = 0; g < flObjs_.size(); ++g) | ||||
| 			SDL_FreeSurface(flObjs_[g]); | ||||
| 		flObjs_.clear(); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void CMinimap::showTile(const int3 &pos) | ||||
| { | ||||
| 	const int player = adventureInt->player; | ||||
| 	std::vector<SDL_Surface*> &map = surfs[player].map(); | ||||
| 	std::vector<SDL_Surface*> &FoW = surfs[player].FoW(); | ||||
| 	std::vector<SDL_Surface*> &flObjs = surfs[player].flObjs(); | ||||
| 	int3 mapSizes = LOCPLINT->cb->getMapSize(); | ||||
| 	//drawing terrain | ||||
| 	int mw = map[0]->w, mh = map[0]->h; | ||||
| @@ -347,8 +386,8 @@ void CMinimap::showTile(const int3 &pos) | ||||
| 			if(tile) | ||||
| 			{ | ||||
| 				if (tile->blocked && (!tile->visitable)) | ||||
| 					SDL_PutPixelWithoutRefresh(map[pos.z], pos.x*wo+ii, pos.y*ho+jj, colorsBlocked[tile->tertype].r, colorsBlocked[tile->tertype].g, colorsBlocked[tile->tertype].b); | ||||
| 				else SDL_PutPixelWithoutRefresh(map[pos.z], pos.x*wo+ii, pos.y*ho+jj, colors[tile->tertype].r, colors[tile->tertype].g, colors[tile->tertype].b); | ||||
| 					SDL_PutPixelWithoutRefresh(surfs[player].map()[pos.z], pos.x*wo+ii, pos.y*ho+jj, colorsBlocked[tile->tertype].r, colorsBlocked[tile->tertype].g, colorsBlocked[tile->tertype].b); | ||||
| 				else SDL_PutPixelWithoutRefresh(surfs[player].map()[pos.z], pos.x*wo+ii, pos.y*ho+jj, colors[tile->tertype].r, colors[tile->tertype].g, colors[tile->tertype].b); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| @@ -403,7 +442,7 @@ void CMinimap::showTile(const int3 &pos) | ||||
| 	//flaggable objects drawn | ||||
| } | ||||
|  | ||||
| void CMinimap::showVisibleTiles(int level) | ||||
| void CMinimapSurfacesRef::showVisibleTiles(int level) | ||||
| { | ||||
| 	int3 mapSizes = LOCPLINT->cb->getMapSize(); | ||||
| 	for(int d=0; d<CGI->mh->map->twoLevel+1; ++d) | ||||
| @@ -416,7 +455,7 @@ void CMinimap::showVisibleTiles(int level) | ||||
| 			{ | ||||
| 				if(LOCPLINT->cb->isVisible(int3(x, y, d))) | ||||
| 				{ | ||||
| 					showTile(int3(x, y, d)); | ||||
| 					adventureInt->minimap.showTile(int3(x, y, d)); | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| @@ -425,6 +464,9 @@ void CMinimap::showVisibleTiles(int level) | ||||
|  | ||||
| void CMinimap::hideTile(const int3 &pos) | ||||
| { | ||||
| 	const int player = adventureInt->player; | ||||
| 	std::vector<SDL_Surface*> &map = surfs[player].map(); | ||||
| 	std::vector<SDL_Surface*> &FoW = surfs[player].FoW(); | ||||
| 	int3 mapSizes = LOCPLINT->cb->getMapSize(); | ||||
| 	//drawing terrain | ||||
| 	int mw = map[0]->w, mh = map[0]->h; | ||||
|   | ||||
| @@ -39,7 +39,25 @@ public: | ||||
| 	~CAdventureOptions(); | ||||
| 	static void showScenarioInfo(); | ||||
| }; | ||||
| 	  | ||||
|  | ||||
| class CMinimapSurfacesRef { | ||||
| public: | ||||
|     CMinimapSurfacesRef(); | ||||
|     std::vector< SDL_Surface* > &map(); | ||||
|     std::vector< SDL_Surface* > &FoW(); | ||||
|     std::vector< SDL_Surface* > &flObjs(); | ||||
|     void free(); | ||||
| private: | ||||
| 	void redraw(int level=-1);// (level==-1) => redraw all levels | ||||
| 	void initMap(int level=-1);// (level==-1) => redraw all levels | ||||
| 	void initFoW(int level=-1);// (level==-1) => redraw all levels | ||||
| 	void initFlaggableObjs(int level=-1);// (level==-1) => redraw all levels | ||||
| 	void showVisibleTiles(int level=-1);// (level==-1) => redraw all levels | ||||
| private:     | ||||
|     std::vector< SDL_Surface* > map_, FoW_, flObjs_; //one bitmap for each level (terrain, Fog of War, flaggable objects) (one for underworld, one for surface) | ||||
|     bool ready; | ||||
| }; | ||||
|  | ||||
| /// Minimap which is displayed at the right upper corner of adventure map | ||||
| class CMinimap : public CIntObject | ||||
| { | ||||
| @@ -48,17 +66,13 @@ public: | ||||
| 	SDL_Surface * temps; | ||||
| 	std::map<int,SDL_Color> colors; | ||||
| 	std::map<int,SDL_Color> colorsBlocked; | ||||
| 	std::vector<SDL_Surface *> map, FoW, flObjs; //one bitmap for each level (terrain, Fog of War, flaggable objects) | ||||
|  | ||||
|     std::map<int, CMinimapSurfacesRef> surfs; | ||||
| 	std::string statusbarTxt, rcText; | ||||
|  | ||||
| 	CMinimap(bool draw=true); | ||||
| 	CMinimap(); | ||||
| 	~CMinimap(); | ||||
| 	void draw(SDL_Surface * to); | ||||
| 	void redraw(int level=-1);// (level==-1) => redraw all levels | ||||
| 	void initMap(int level=-1);// (level==-1) => redraw all levels | ||||
| 	void initFoW(int level=-1);// (level==-1) => redraw all levels | ||||
| 	void initFlaggableObjs(int level=-1);// (level==-1) => redraw all levels | ||||
|  | ||||
| 	void updateRadar(); | ||||
|  | ||||
| 	void clickRight(tribool down, bool previousState); | ||||
| @@ -69,7 +83,6 @@ public: | ||||
| 	void deactivate(); // makes button inactive (but don't deletes) | ||||
| 	void hideTile(const int3 &pos); //puts FoW | ||||
| 	void showTile(const int3 &pos); //removes FoW | ||||
| 	void showVisibleTiles(int level=-1);// (level==-1) => redraw all levels | ||||
| }; | ||||
|  | ||||
| /// Holds information about which tiles of the terrain are shown/not shown at the screen | ||||
|   | ||||
| @@ -40,6 +40,8 @@ const double M_PI = 3.14159265358979323846; | ||||
| #endif | ||||
| #include <boost/format.hpp> | ||||
|  | ||||
| const time_t CBattleInterface::HOVER_ANIM_DELTA = 1; | ||||
|  | ||||
| /* | ||||
|  * CBattleInterface.cpp, part of VCMI engine | ||||
|  * | ||||
| @@ -1182,10 +1184,11 @@ void CBattleInterface::addNewAnim(CBattleAnimation * anim) | ||||
|  | ||||
| CBattleInterface::CBattleInterface(const CCreatureSet * army1, const CCreatureSet * army2, CGHeroInstance *hero1, CGHeroInstance *hero2, const SDL_Rect & myRect, CPlayerInterface * att, CPlayerInterface * defen) | ||||
| 	: queue(NULL), attackingHeroInstance(hero1), defendingHeroInstance(hero2), animCount(0),  | ||||
| 	  activeStack(NULL), stackToActivate(NULL), mouseHoveredStack(-1), previouslyHoveredHex(-1), | ||||
| 	  activeStack(NULL), stackToActivate(NULL), mouseHoveredStack(-1), lastMouseHoveredStackAnimationTime(-1), previouslyHoveredHex(-1), | ||||
| 	  currentlyHoveredHex(-1), tacticianInterface(NULL),  spellDestSelectMode(false), spellToCast(NULL), | ||||
| 	  siegeH(NULL), attackerInt(att), defenderInt(defen), curInt(att), animIDhelper(0), givenCommand(NULL), | ||||
| 	  myTurn(false), resWindow(NULL), moveStarted(false), moveSh(-1), bresult(NULL) | ||||
|        | ||||
| { | ||||
| 	ObjectConstruction h__l__p(this); | ||||
|  | ||||
| @@ -1453,7 +1456,7 @@ CBattleInterface::CBattleInterface(const CCreatureSet * army1, const CCreatureSe | ||||
|  | ||||
| 	int channel = CCS->soundh->playSoundFromSet(CCS->soundh->battleIntroSounds); | ||||
| 	CCS->soundh->setCallback(channel, boost::bind(&CMusicHandler::playMusicFromSet, CCS->musich, CCS->musich->battleMusics, -1)); | ||||
| 	 | ||||
|     memset(stackCountOutsideHexes, 1, BFIELD_SIZE * sizeof(bool)); //initialize array with trues	 | ||||
| } | ||||
|  | ||||
| CBattleInterface::~CBattleInterface() | ||||
| @@ -1990,6 +1993,7 @@ void CBattleInterface::mouseMoved(const SDL_MouseMotionEvent &sEvent) | ||||
| { | ||||
| 	if(activeStack!= NULL && !spellDestSelectMode) | ||||
| 	{ | ||||
|         int lastMouseHoveredStack = mouseHoveredStack; | ||||
| 		mouseHoveredStack = -1; | ||||
| 		int myNumber = -1; //number of hovered tile | ||||
| 		for(int g = 0; g < BFIELD_SIZE; ++g) | ||||
| @@ -2033,12 +2037,16 @@ void CBattleInterface::mouseMoved(const SDL_MouseMotionEvent &sEvent) | ||||
| 						sprintf(buf, CGI->generaltexth->allTexts[297].c_str(), shere->count == 1 ? shere->getCreature()->nameSing.c_str() : shere->getCreature()->namePl.c_str()); | ||||
| 						console->alterTxt = buf; | ||||
| 						console->whoSetAlter = 0; | ||||
| 						mouseHoveredStack = shere->ID; | ||||
| 						if(creAnims[shere->ID]->getType() == CCreatureAnim::HOLDING && creAnims[shere->ID]->framesInGroup(CCreatureAnim::MOUSEON) > 0) | ||||
|                         const time_t curTime = time(NULL); | ||||
| 						if(shere->ID != lastMouseHoveredStack && | ||||
|                            curTime > lastMouseHoveredStackAnimationTime + HOVER_ANIM_DELTA && | ||||
|                            creAnims[shere->ID]->getType() == CCreatureAnim::HOLDING && | ||||
|                            creAnims[shere->ID]->framesInGroup(CCreatureAnim::MOUSEON) > 0) | ||||
| 						{ | ||||
| 							creAnims[shere->ID]->playOnce(CCreatureAnim::MOUSEON); | ||||
|                             lastMouseHoveredStackAnimationTime = curTime; | ||||
| 						} | ||||
| 						 | ||||
| 						mouseHoveredStack = shere->ID; | ||||
| 					} | ||||
| 					else if(curInt->cb->battleCanShoot(activeStack,myNumber)) //we can shoot enemy | ||||
| 					{ | ||||
| @@ -3527,11 +3535,11 @@ void CBattleInterface::showAliveStack(const CStack *stack, SDL_Surface * to) | ||||
| 	{ | ||||
|         const THex nextPos = stack->position + (stack->attackerOwned ? 1 : -1); | ||||
|         const bool edge = stack->position % BFIELD_WIDTH == (stack->attackerOwned ? BFIELD_WIDTH - 2 : 1); | ||||
|         const bool moveInside = !edge && !isHexAccessible(nextPos); | ||||
|         const bool moveInside = !edge && !stackCountOutsideHexes[nextPos]; | ||||
| 		int xAdd = (stack->attackerOwned ? 220 : 202) + | ||||
|                    (stack->doubleWide() ? 44 : 0) * (stack->attackerOwned ? +1 : -1) + | ||||
|                    (moveInside ? amountNormal->w + 10 : 0) * (stack->attackerOwned ? -1 : +1); | ||||
|          | ||||
|         int yAdd = 260 + ((stack->attackerOwned || moveInside) ? 0 : -15); | ||||
| 		//blitting amount background box | ||||
| 		SDL_Surface *amountBG = NULL; | ||||
| 		boost::shared_ptr<BonusList> spellEffects = stack->getSpellBonuses(); | ||||
| @@ -3560,13 +3568,13 @@ void CBattleInterface::showAliveStack(const CStack *stack, SDL_Surface * to) | ||||
| 				amountBG = amountEffNeutral; | ||||
| 			} | ||||
| 		} | ||||
| 		SDL_Rect temp_rect = genRect(amountNormal->h, amountNormal->w, creAnims[ID]->pos.x + xAdd, creAnims[ID]->pos.y + 260); | ||||
| 		SDL_Rect temp_rect = genRect(amountNormal->h, amountNormal->w, creAnims[ID]->pos.x + xAdd, creAnims[ID]->pos.y + yAdd); | ||||
| 		SDL_BlitSurface(amountBG, NULL, to, &temp_rect); | ||||
| 		//blitting amount | ||||
| 		CSDL_Ext::printAtMiddle( | ||||
| 			makeNumberShort(stack->count), | ||||
| 			creAnims[ID]->pos.x + xAdd + 15, | ||||
| 			creAnims[ID]->pos.y + 260 + 5, | ||||
| 			creAnims[ID]->pos.y + yAdd + 5, | ||||
| 			FONT_TINY, | ||||
| 			zwykly, | ||||
| 			to | ||||
| @@ -3654,7 +3662,7 @@ void CBattleInterface::redrawBackgroundWithHexes(const CStack * activeStack) | ||||
| 	attackableHexes.clear(); | ||||
| 	if (activeStack) | ||||
| 		occupyableHexes = curInt->cb->battleGetAvailableHexes(activeStack, true, &attackableHexes); | ||||
|  | ||||
|     curInt->cb->battleGetStackCountOutsideHexes(stackCountOutsideHexes); | ||||
| 	//preparating background graphic with hexes and shaded hexes | ||||
| 	blitAt(background, 0, 0, backgroundWithHexes); | ||||
| 	if(curInt->sysOpts.printCellBorders) | ||||
| @@ -3976,13 +3984,6 @@ void CBattleInterface::bTacticNextStack() | ||||
| 		stackActivated(stacksOfMine.front()); | ||||
| } | ||||
|  | ||||
| bool CBattleInterface::isHexAccessible(THex nextPos) | ||||
| { | ||||
| 	//!vstd::contains(curInt->cb->battleGetAvailableHexes(stack, true), nextPos) | ||||
| 	//TODO has to be fast | ||||
| 	return true; | ||||
| } | ||||
|  | ||||
| void CBattleHero::show(SDL_Surface *to) | ||||
| { | ||||
| 	//animation of flag | ||||
|   | ||||
| @@ -435,8 +435,11 @@ private: | ||||
| 	const CStack * stackToActivate; //when animation is playing, we should wait till the end to make the next stack active; NULL of none | ||||
| 	void activateStack(); //sets activeStack to stackToActivate etc. | ||||
| 	int mouseHoveredStack; //stack hovered by mouse; if -1 -> none | ||||
|     time_t lastMouseHoveredStackAnimationTime; // time when last mouse hovered animation occured | ||||
|     static const time_t HOVER_ANIM_DELTA; | ||||
| 	std::vector<THex> occupyableHexes, //hexes available for active stack | ||||
| 		attackableHexes; //hexes attackable by active stack | ||||
|     bool stackCountOutsideHexes[BFIELD_SIZE]; // hexes that when in front of a unit cause it's amount box to move back | ||||
| 	int previouslyHoveredHex; //number of hex that was hovered by the cursor a while ago | ||||
| 	int currentlyHoveredHex; //number of hex that is supposed to be hovered (for a while it may be inappropriately set, but will be renewed soon) | ||||
| 	float getAnimSpeedMultiplier() const; //returns multiplier for number of frames in a group | ||||
| @@ -462,7 +465,6 @@ private: | ||||
| 	void giveCommand(ui8 action, THex tile, ui32 stack, si32 additional=-1); | ||||
| 	bool isTileAttackable(const THex & number) const; //returns true if tile 'number' is neighboring any tile from active stack's range or is one of these tiles | ||||
| 	bool blockedByObstacle(THex hex) const; | ||||
| 	bool isHexAccessible(THex nextPos); | ||||
| 	bool isCatapultAttackable(THex hex) const; //returns true if given tile can be attacked by catapult | ||||
|  | ||||
| 	std::list<SBattleEffect> battleEffects; //different animations to display on the screen like spell effects | ||||
|   | ||||
| @@ -702,12 +702,12 @@ void Graphics::loadFonts() | ||||
|  | ||||
| CDefEssential * Graphics::getDef( const CGObjectInstance * obj ) | ||||
| { | ||||
| 	return advmapobjGraphics[obj->defInfo->id][obj->defInfo->subid]; | ||||
| 	return advmapobjGraphics[obj->defInfo->id][obj->defInfo->subid][obj->defInfo->name]; | ||||
| } | ||||
|  | ||||
| CDefEssential * Graphics::getDef( const CGDefInfo * info ) | ||||
| { | ||||
| 	return advmapobjGraphics[info->id][info->subid]; | ||||
| 	return advmapobjGraphics[info->id][info->subid][info->name]; | ||||
| } | ||||
|  | ||||
| void Graphics::loadErmuToPicture() | ||||
|   | ||||
| @@ -68,7 +68,7 @@ public: | ||||
| 	CDefHandler * FoWfullHide; //for Fog of War | ||||
| 	CDefHandler * FoWpartialHide; //for For of War | ||||
|  | ||||
| 	std::map<int, std::map<int, CDefEssential *> > advmapobjGraphics; | ||||
| 	std::map<int, std::map<int, std::map<std::string, CDefEssential *> > > advmapobjGraphics; | ||||
| 	CDefEssential * getDef(const CGObjectInstance * obj); | ||||
| 	CDefEssential * getDef(const CGDefInfo * info); | ||||
| 	//creatures | ||||
|   | ||||
| @@ -249,12 +249,11 @@ void CMapHandler::initObjectRects() | ||||
| 			|| (obj->ID==HEROI_TYPE && static_cast<const CGHeroInstance*>(obj)->inTownGarrison) //garrisoned hero | ||||
| 			|| (obj->ID==8 && static_cast<const CGBoat*>(obj)->hero) //boat wih hero (hero graphics is used) | ||||
| 			|| !obj->defInfo | ||||
| 			|| !obj->defInfo->handler) //no graphic... | ||||
| 			|| !graphics->getDef(obj)) //no graphic... | ||||
| 		{ | ||||
| 			continue; | ||||
| 		} | ||||
|  | ||||
| 		const SDL_Surface *bitmap = obj->defInfo->handler->ourImages[0].bitmap; | ||||
| 		const SDL_Surface *bitmap = graphics->getDef(obj)->ourImages[0].bitmap; | ||||
| 		for(int fx=0; fx<bitmap->w>>5; ++fx) //bitmap->w/32 | ||||
| 		{ | ||||
| 			for(int fy=0; fy<bitmap->h>>5; ++fy) //bitmap->h/32 | ||||
| @@ -298,64 +297,49 @@ static void processDef (const CGDefInfo* def) | ||||
| { | ||||
| 	if(def->id == EVENTI_TYPE) | ||||
| 	{ | ||||
|         graphics->advmapobjGraphics[def->id][def->subid][def->name] = NULL; | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	if(!def->handler) //if object has already set handler (eg. heroes) it should not be overwritten  | ||||
|     CDefEssential * ourDef = graphics->getDef(def); | ||||
| 	if(!ourDef) //if object has already set handler (eg. heroes) it should not be overwritten  | ||||
| 	{ | ||||
| 		if(def->name.size()) | ||||
| 		{ | ||||
| 			if(vstd::contains(graphics->mapObjectDefs, def->name)) | ||||
| 			{ | ||||
| 				const_cast<CGDefInfo*>(def)->handler = graphics->mapObjectDefs[def->name]; | ||||
|                 graphics->advmapobjGraphics[def->id][def->subid][def->name] = graphics->mapObjectDefs[def->name]; | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				graphics->mapObjectDefs[def->name] = const_cast<CGDefInfo*>(def)->handler = CDefHandler::giveDefEss(def->name); | ||||
|                 graphics->mapObjectDefs[def->name] = graphics->advmapobjGraphics[def->id][def->subid][def->name] = CDefHandler::giveDefEss(def->name); | ||||
| 			} | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			tlog2 << "No def name for " << def->id << "  " << def->subid << std::endl; | ||||
| 			const_cast<CGDefInfo*>(def)->handler = NULL; | ||||
| 			return; | ||||
| 		} | ||||
|  | ||||
|  		const_cast<CGDefInfo*>(def)->width = def->handler->ourImages[0].bitmap->w/32; | ||||
|  		const_cast<CGDefInfo*>(def)->height = def->handler->ourImages[0].bitmap->h/32; | ||||
|         ourDef = graphics->getDef(def); | ||||
|          | ||||
| 	} | ||||
| 	 | ||||
| 	CGDefInfo* pom = const_cast<CGameInfo*>(CGI)->dobjinfo->gobjs[def->id][def->subid];  | ||||
| 	if(pom && def->id!=TOWNI_TYPE)  | ||||
| 	{  | ||||
| 		pom->handler = def->handler;  | ||||
| 		pom->width = pom->handler->ourImages[0].bitmap->w/32;  | ||||
| 		pom->height = pom->handler->ourImages[0].bitmap->h/32;  | ||||
| 	}  | ||||
| 	else if(def->id != HEROI_TYPE && def->id != TOWNI_TYPE)  | ||||
| 		tlog3 << "\t\tMinor warning: lacking def info for " << def->id << " " << def->subid <<" " << def->name << std::endl;  | ||||
| 	 | ||||
| 	//alpha transformation | ||||
| 	for(size_t yy=0; yy < def->handler->ourImages.size(); ++yy) | ||||
| 	for(size_t yy=0; yy < ourDef->ourImages.size(); ++yy) | ||||
| 	{ | ||||
| 		CSDL_Ext::alphaTransform(def->handler->ourImages[yy].bitmap); | ||||
| 		CSDL_Ext::alphaTransform(ourDef->ourImages[yy].bitmap); | ||||
| 	} | ||||
| } | ||||
| void CMapHandler::initHeroDef(const CGHeroInstance * h) | ||||
| { | ||||
| 	h->defInfo->handler = graphics->flags1[0];  | ||||
| 	h->defInfo->width = h->defInfo->handler->ourImages[0].bitmap->w/32;  | ||||
| 	h->defInfo->height = h->defInfo->handler->ourImages[0].bitmap->h/32; | ||||
|     graphics->advmapobjGraphics[h->defInfo->id][h->defInfo->subid][h->defInfo->name] = graphics->flags1[0]; | ||||
| } | ||||
| void CMapHandler::init() | ||||
| { | ||||
| 	timeHandler th; | ||||
| 	th.getDif(); | ||||
|  | ||||
| 	const_cast<CGameInfo*>(CGI)->dobjinfo->gobjs[8][0]->handler = graphics->boatAnims[0];  | ||||
| 	const_cast<CGameInfo*>(CGI)->dobjinfo->gobjs[8][1]->handler = graphics->boatAnims[1];  | ||||
| 	const_cast<CGameInfo*>(CGI)->dobjinfo->gobjs[8][2]->handler = graphics->boatAnims[2]; | ||||
|  | ||||
|     graphics->advmapobjGraphics[8][0]["AB01_.DEF"] = graphics->boatAnims[0]; | ||||
|     graphics->advmapobjGraphics[8][1]["AB02_.DEF"] = graphics->boatAnims[1]; | ||||
|     graphics->advmapobjGraphics[8][2]["AB03_.DEF"] = graphics->boatAnims[2]; | ||||
| 	// Size of visible terrain. | ||||
| 	int mapW = conf.go()->ac.advmapW; | ||||
| 	int mapH = conf.go()->ac.advmapH; | ||||
| @@ -387,7 +371,7 @@ void CMapHandler::init() | ||||
|  | ||||
| 	for(int i=0;i<map->heroes.size();i++) | ||||
| 	{ | ||||
| 		if( !map->heroes[i]->defInfo->handler ) | ||||
| 		if( !graphics->getDef(map->heroes[i]) ) | ||||
| 		{ | ||||
| 			initHeroDef(map->heroes[i]); | ||||
| 		} | ||||
| @@ -527,6 +511,9 @@ void CMapHandler::terrainRect( int3 top_tile, unsigned char anim, const std::vec | ||||
| 			for(int h=0; h < objects.size(); ++h) | ||||
| 			{ | ||||
| 				const CGObjectInstance *obj = objects[h].first; | ||||
|                 if (!graphics->getDef(obj)) | ||||
|                     processDef(obj->defInfo); | ||||
|  | ||||
| 				ui8 color = obj->tempOwner; | ||||
|  | ||||
| 				//checking if object has non-empty graphic on this tile | ||||
| @@ -639,7 +626,7 @@ void CMapHandler::terrainRect( int3 top_tile, unsigned char anim, const std::vec | ||||
| 				} | ||||
| 				else //blit normal object | ||||
| 				{ | ||||
| 					const std::vector<Cimage> &ourImages = obj->defInfo->handler->ourImages; | ||||
| 					const std::vector<Cimage> &ourImages = graphics->getDef(obj)->ourImages; | ||||
| 					SDL_Surface *bitmap = ourImages[(anim+obj->animPhaseShift)%ourImages.size()].bitmap; | ||||
|  | ||||
| 					//setting appropriate flag color | ||||
| @@ -835,10 +822,10 @@ std::pair<SDL_Surface *, bool> CMapHandler::getVisBitmap( const int3 & pos, cons | ||||
|  | ||||
| bool CMapHandler::printObject(const CGObjectInstance *obj) | ||||
| { | ||||
| 	if(!obj->defInfo->handler) | ||||
|     if (!graphics->getDef(obj)) | ||||
| 		processDef(obj->defInfo); | ||||
|  | ||||
| 	const SDL_Surface *bitmap = obj->defInfo->handler->ourImages[0].bitmap; | ||||
| 	const SDL_Surface *bitmap = graphics->getDef(obj)->ourImages[0].bitmap;  | ||||
| 	const int tilesW = bitmap->w/32; | ||||
| 	const int tilesH = bitmap->h/32; | ||||
|  | ||||
| @@ -879,7 +866,7 @@ bool CMapHandler::printObject(const CGObjectInstance *obj) | ||||
|  | ||||
| bool CMapHandler::hideObject(const CGObjectInstance *obj) | ||||
| { | ||||
| 	CDefEssential * curd = obj->defInfo->handler; | ||||
| 	CDefEssential * curd = graphics->getDef(obj); | ||||
| 	if(!curd) return false; | ||||
| 	const SDL_Surface *bitmap = curd->ourImages[0].bitmap; | ||||
| 	for(int fx=0; fx<bitmap->w/32; ++fx) | ||||
|   | ||||
| @@ -30,7 +30,6 @@ bool CGDefInfo::isVisitable() const | ||||
| } | ||||
| CGDefInfo::CGDefInfo() | ||||
| { | ||||
| 	handler = NULL; | ||||
| 	visitDir = (8|16|32|64|128); //4,5,6,7,8 - any not-from-up direction | ||||
|  | ||||
| 	width = height = -1; | ||||
| @@ -59,7 +58,6 @@ void CDefObjInfoHandler::load() | ||||
| 	for(int hh=0; hh<objNumber; ++hh) | ||||
| 	{ | ||||
| 		CGDefInfo* nobj = new CGDefInfo(); | ||||
| 		nobj->handler = NULL; | ||||
| 		std::string dump; | ||||
| 		inp>>nobj->name; | ||||
| 		 | ||||
|   | ||||
| @@ -29,7 +29,6 @@ public: | ||||
| 	si32 id, subid; //of object described by this defInfo | ||||
| 	si32 terrainAllowed, //on which terrain it is possible to place object | ||||
| 		 terrainMenu; //in which menus in map editor object will be showed | ||||
| 	CDefEssential * handler;  | ||||
| 	si32 width, height; //tiles | ||||
| 	si32 type; //(0- ground, 1- towns, 2-creatures, 3- heroes, 4-artifacts, 5- resources)    | ||||
| 	si32 printPriority; | ||||
|   | ||||
| @@ -1737,28 +1737,25 @@ int CGameState::getPlayerRelations( ui8 color1, ui8 color2 ) | ||||
|  | ||||
| void CGameState::loadTownDInfos() | ||||
| { | ||||
| 	for(int i=0;i<F_NUMBER;i++) | ||||
| 	{ | ||||
|     int i; | ||||
| 	const JsonNode config(DATA_DIR "/config/towns_defs.json"); | ||||
|     JsonVector vec = config["town_defnames"].Vector(); | ||||
|     assert(vec.size() == F_NUMBER); | ||||
|     for (i = 0; i < vec.size(); ++i) { | ||||
| 		villages[i] = new CGDefInfo(*VLC->dobjinfo->castles[i]); | ||||
| 		forts[i] = VLC->dobjinfo->castles[i]; | ||||
| 		map->defy.push_back(forts[i]); | ||||
| 		capitols[i] = new CGDefInfo(*VLC->dobjinfo->castles[i]); | ||||
| 	} | ||||
|  | ||||
| 	std::ifstream ifs(DATA_DIR "/config/townsDefs.txt"); | ||||
| 	int ccc; | ||||
| 	ifs>>ccc; | ||||
| 	for(int i=0; i < ccc*2; i++) | ||||
| 	{ | ||||
| 		CGDefInfo *n; | ||||
| 		if(i<ccc) | ||||
| 			n = villages[i]; | ||||
| 		else  | ||||
| 			n = capitols[i%ccc]; | ||||
|  | ||||
| 		ifs >> n->name; | ||||
| 		map->defy.push_back(n); | ||||
| 	} | ||||
|     i = 0; | ||||
|     BOOST_FOREACH(const JsonNode &t, vec) { | ||||
|         villages[i]->name = t["village"].String(); | ||||
|         capitols[i]->name = t["capitol"].String(); | ||||
|         ++i; | ||||
|     } | ||||
|     for (i = 0; i < vec.size(); ++i) map->defy.push_back(villages[i]); | ||||
|     for (i = 0; i < vec.size(); ++i) map->defy.push_back(capitols[i]); | ||||
| } | ||||
|  | ||||
| void CGameState::getNeighbours(const TerrainTile &srct, int3 tile, std::vector<int3> &vec, const boost::logic::tribool &onLand, bool limitCoastSailing) | ||||
|   | ||||
| @@ -220,6 +220,19 @@ void CBattleInfoCallback::getStackQueue( std::vector<const CStack *> &out, int h | ||||
| 	gs->curB->getStackQueue(out, howMany); | ||||
| } | ||||
|  | ||||
| void CBattleInfoCallback::battleGetStackCountOutsideHexes(bool *ac) | ||||
| { | ||||
| 	if(!gs->curB) | ||||
| 	{ | ||||
| 		tlog2<<"battleGetAvailableHexes called when there is no battle!"<<std::endl; | ||||
|         for (int i = 0; i < BFIELD_SIZE; ++i) ac[i] = false; | ||||
| 	} | ||||
|     else { | ||||
|         std::set<THex> ignored; | ||||
|         gs->curB->getAccessibilityMap(ac, false /*ignored*/, false, false, ignored, false /*ignored*/, NULL); | ||||
|     } | ||||
| } | ||||
|  | ||||
| std::vector<THex> CBattleInfoCallback::battleGetAvailableHexes(const CStack * stack, bool addOccupiable, std::vector<THex> * attackable) | ||||
| { | ||||
| 	//boost::shared_lock<boost::shared_mutex> lock(*gs->mx); | ||||
|   | ||||
| @@ -97,6 +97,7 @@ public: | ||||
| 	THex battleGetPos(int stack); //returns position (tile ID) of stack | ||||
| 	TStacks battleGetStacks(EStackOwnership whose = MINE_AND_ENEMY, bool onlyAlive = true); //returns stacks on battlefield | ||||
| 	void getStackQueue( std::vector<const CStack *> &out, int howMany ); //returns vector of stack in order of their move sequence | ||||
|     void battleGetStackCountOutsideHexes(bool *ac); // returns hexes which when in front of a stack cause us to move the amount box back | ||||
| 	std::vector<THex> battleGetAvailableHexes(const CStack * stack, bool addOccupiable, std::vector<THex> * attackable = NULL); //returns numbers of hexes reachable by creature with id ID | ||||
| 	std::vector<int> battleGetDistances(const CStack * stack, THex hex = THex::INVALID, THex * predecessors = NULL); //returns vector of distances to [dest hex number] | ||||
| 	bool battleCanShoot(const CStack * stack, THex dest); //returns true if unit with id ID can shoot to dest | ||||
|   | ||||
		Reference in New Issue
	
	Block a user