mirror of
				https://github.com/vcmi/vcmi.git
				synced 2025-10-31 00:07:39 +02:00 
			
		
		
		
	| @@ -1,4 +1,13 @@ | ||||
| #include "CEmptyAI.h" | ||||
| #include <iostream> | ||||
| void CEmptyAI::init(CCallback * CB) | ||||
| { | ||||
| 	cb = CB; | ||||
| 	human=false; | ||||
| 	playerID=-1; | ||||
| 	serialID=-1; | ||||
| 	std::cout << "EmptyAI initialized." << std::endl; | ||||
| } | ||||
| void CEmptyAI::yourTurn() | ||||
| { | ||||
| } | ||||
|   | ||||
| @@ -1,8 +1,10 @@ | ||||
| #include "../../AI_Base.h" | ||||
|  | ||||
| class CEmptyAI : public CAIBase | ||||
| class CEmptyAI : public CGlobalAI | ||||
| { | ||||
| 	CCallback * cb; | ||||
| public: | ||||
| 	void init(CCallback * CB); | ||||
| 	void yourTurn(); | ||||
| 	void heroKilled(const CHeroInstance *); | ||||
| 	void heroCreated(const CHeroInstance *); | ||||
|   | ||||
| @@ -36,6 +36,8 @@ | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				Optimization="0" | ||||
| 				DebugInformationFormat="3" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManagedResourceCompilerTool" | ||||
| @@ -48,7 +50,12 @@ | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCLinkerTool" | ||||
| 				OutputFile="EmptyAI.dll" | ||||
| 				OutputFile="../EmptyAI.dll" | ||||
| 				Version="0.1" | ||||
| 				GenerateDebugInformation="true" | ||||
| 				GenerateMapFile="true" | ||||
| 				MapFileName="mapfile.map" | ||||
| 				MapExports="true" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCALinkTool" | ||||
| @@ -98,6 +105,12 @@ | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				Optimization="3" | ||||
| 				InlineFunctionExpansion="2" | ||||
| 				EnableIntrinsicFunctions="true" | ||||
| 				FavorSizeOrSpeed="1" | ||||
| 				EnableFiberSafeOptimizations="true" | ||||
| 				WholeProgramOptimization="true" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManagedResourceCompilerTool" | ||||
| @@ -110,7 +123,7 @@ | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCLinkerTool" | ||||
| 				OutputFile="EmptyAI.dll" | ||||
| 				OutputFile="../EmptyAI.dll" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCALinkTool" | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
| #include "CEmptyAI.h" | ||||
| #include <cstring> | ||||
| #include <set> | ||||
| std::set<CAIBase*> ais; | ||||
| std::set<CGlobalAI*> ais; | ||||
|  | ||||
| DLL_EXPORT int GetGlobalAiVersion() | ||||
| { | ||||
| @@ -13,13 +13,19 @@ DLL_EXPORT void GetAiName(char* name) | ||||
| { | ||||
| 	strcpy(name,NAME); | ||||
| } | ||||
| DLL_EXPORT CAIBase * GetNewAI() | ||||
| DLL_EXPORT char * GetAiNameS() | ||||
| { | ||||
| 	char * ret = new char[50]; | ||||
| 	strcpy(ret,NAME); | ||||
| 	return ret; | ||||
| } | ||||
| DLL_EXPORT CGlobalAI * GetNewAI() | ||||
| { | ||||
| 	return new CEmptyAI(); | ||||
| // return | ||||
| } | ||||
| DLL_EXPORT void ReleaseAI(CAIBase * i) | ||||
| DLL_EXPORT void ReleaseAI(CGlobalAI * i) | ||||
| { | ||||
| 	//delete (TTAICore*)i; | ||||
| 	//ais.erase(i); | ||||
| 	delete (CEmptyAI*)i; | ||||
| 	ais.erase(i); | ||||
| } | ||||
| @@ -3,9 +3,6 @@ | ||||
| #include <iostream> | ||||
| #include "int3.h" | ||||
| #include "CGameInterface.h" | ||||
| class CAIBase : public CGameInterface | ||||
| { | ||||
| }; | ||||
|  | ||||
| #define AI_INTERFACE_VER 1 | ||||
| #ifdef _WIN32 | ||||
|   | ||||
| @@ -1069,8 +1069,11 @@ CResDataBar::CResDataBar() | ||||
| { | ||||
| 	bg = CGI->bitmaph->loadBitmap("ZRESBAR.bmp"); | ||||
| 	SDL_SetColorKey(bg,SDL_SRCCOLORKEY,SDL_MapRGB(bg->format,0,255,255)); | ||||
| 	blueToPlayersAdv(bg,LOCPLINT->playerID); | ||||
| 	//blueToPlayersNice(bg,LOCPLINT->playerID); | ||||
| 	//std::vector<SDL_Color> kolory; | ||||
| 	//SDL_Color p1={40,65,139,255}, p2={36,59,125,255}, p3={35,56,121,255}; | ||||
| 	//kolory+=p1,p2,p3; | ||||
| 	//blueToPlayersAdv(bg,LOCPLINT->playerID,2,&kolory); | ||||
| 	blueToPlayersAdv(bg,LOCPLINT->playerID,2); | ||||
| 	pos = genRect(bg->h,bg->w,3,575); | ||||
|  | ||||
| 	txtpos  +=  (std::pair<int,int>(35,577)),(std::pair<int,int>(120,577)),(std::pair<int,int>(205,577)), | ||||
| @@ -1221,6 +1224,7 @@ void CAdvMapInt::fnextHero() | ||||
| } | ||||
| void CAdvMapInt::fendTurn() | ||||
| { | ||||
| 	LOCPLINT->makingTurn = false; | ||||
| } | ||||
|  | ||||
| void CAdvMapInt::show() | ||||
| @@ -1262,6 +1266,23 @@ void CAdvMapInt::show() | ||||
|  | ||||
| 	SDL_Flip(ekran); | ||||
| } | ||||
| void CAdvMapInt::hide() | ||||
| { | ||||
| 	kingOverview.deactivate(); | ||||
| 	underground.deactivate(); | ||||
| 	questlog.deactivate(); | ||||
| 	sleepWake.deactivate(); | ||||
| 	moveHero.deactivate(); | ||||
| 	spellbook.deactivate(); | ||||
| 	advOptions.deactivate(); | ||||
| 	sysOptions.deactivate(); | ||||
| 	nextHero.deactivate(); | ||||
| 	endTurn.deactivate(); | ||||
| 	minimap.deactivate(); | ||||
| 	heroList.deactivate(); | ||||
| 	townList.deactivate(); | ||||
| 	terrain.deactivate(); | ||||
| } | ||||
| void CAdvMapInt::update() | ||||
| { | ||||
| 	terrain.show(); | ||||
|   | ||||
| @@ -253,6 +253,7 @@ public: | ||||
| 	void fendTurn(); | ||||
|  | ||||
| 	void show(); //shows and activates adv. map interface | ||||
| 	void hide(); //deactivates advmap interface | ||||
| 	void update(); //redraws terrain | ||||
|  | ||||
| 	void centerOn(int3 on); | ||||
|   | ||||
| @@ -32,6 +32,7 @@ int CCallback::valMovePoints(CHeroInstance * chi) | ||||
| void CCallback::newTurn() | ||||
| { | ||||
| 	//std::map<int, PlayerState>::iterator i = gs->players.begin() ; | ||||
| 	gs->day++; | ||||
| 	for ( std::map<int, PlayerState>::iterator i=gs->players.begin() ; i!=gs->players.end();i++) | ||||
| 	{ | ||||
| 		for (int j=0;j<(*i).second.heroes.size();j++) | ||||
|   | ||||
| @@ -12,6 +12,12 @@ | ||||
| #include "hch/CLodHandler.h" | ||||
| #include "CPathfinder.h" | ||||
| #include <sstream> | ||||
|  | ||||
| #ifdef _WIN32 | ||||
| 	#include <windows.h> //for .dll libs | ||||
| #else | ||||
| 	#include <dlfcn.h> | ||||
| #endif | ||||
| using namespace CSDL_Ext; | ||||
| class OCM_HLP_CGIN | ||||
| { | ||||
| @@ -111,6 +117,37 @@ void MotionInterested::deactivate() | ||||
| 	LOCPLINT-> | ||||
| 		motioninterested.erase(std::find(LOCPLINT->motioninterested.begin(),LOCPLINT->motioninterested.end(),this)); | ||||
| } | ||||
|  | ||||
| CGlobalAI * CAIHandler::getNewAI(CCallback * cb, std::string dllname) | ||||
| { | ||||
| 	dllname = "AI/"+dllname; | ||||
| 	CGlobalAI * ret=NULL; | ||||
| 	CGlobalAI*(*getAI)(); | ||||
| 	void(*getName)(char*); | ||||
| #ifdef _WIN32 | ||||
| 	HINSTANCE dll = LoadLibraryA(dllname.c_str()); | ||||
| 	if (!dll) | ||||
| 	{ | ||||
| 		std::cout << "Cannot open AI library ("<<dllname<<"). Throwing..."<<std::endl; | ||||
| 		throw new std::exception("Cannot open AI library"); | ||||
| 	} | ||||
| 	//int len = dllname.size()+1; | ||||
| 	getName = (void(*)(char*))GetProcAddress(dll,"GetAiName"); | ||||
| 	getAI = (CGlobalAI*(*)())GetProcAddress(dll,"GetNewAI"); | ||||
| #else | ||||
| 	; //TODO: handle AI library on Linux | ||||
| #endif | ||||
| 	char * temp = new char[50]; | ||||
| 	getName(temp); | ||||
| 	std::cout << "Loaded .dll with AI named " << temp << std::endl; | ||||
| 	delete temp; | ||||
| 	ret = getAI(); | ||||
| 	ret->init(cb); | ||||
| 	return ret; | ||||
| } | ||||
| //CGlobalAI::CGlobalAI() | ||||
| //{ | ||||
| //} | ||||
| CPlayerInterface::CPlayerInterface(int Player, int serial) | ||||
| { | ||||
| 	playerID=Player; | ||||
| @@ -145,6 +182,7 @@ void CPlayerInterface::init(CCallback * CB) | ||||
| } | ||||
| void CPlayerInterface::yourTurn() | ||||
| { | ||||
| 	makingTurn = true; | ||||
| 	CGI->localPlayer = serialID; | ||||
| 	unsigned char & animVal = LOCPLINT->adventureInt->anim; //for animations handling | ||||
| 	adventureInt->show(); | ||||
| @@ -156,7 +194,7 @@ void CPlayerInterface::yourTurn() | ||||
| 	SDL_setFramerate(mainFPSmng, 24); | ||||
| 	SDL_Event sEvent; | ||||
| 	//framerate keeper initialized | ||||
| 	for(;;) // main loop | ||||
| 	for(;makingTurn;) // main loop | ||||
| 	{ | ||||
| 		CGI->screenh->updateScreen(); | ||||
|  | ||||
| @@ -215,6 +253,7 @@ void CPlayerInterface::yourTurn() | ||||
| 		SDL_Delay(5); //give time for other apps | ||||
| 		SDL_framerateDelay(mainFPSmng); | ||||
| 	} | ||||
| 	adventureInt->hide(); | ||||
| } | ||||
|  | ||||
| inline void subRect(const int & x, const int & y, const int & z, SDL_Rect & r, const int & hid) | ||||
| @@ -807,7 +846,7 @@ SDL_Surface * CPlayerInterface::infoWin(void * specific) //specific=0 => draws i | ||||
| 			char * buf = new char[10]; | ||||
| 			SDL_Surface * ret = copySurface(hInfo); | ||||
| 			SDL_SetColorKey(ret,SDL_SRCCOLORKEY,SDL_MapRGB(ret->format,0,255,255)); | ||||
| 			blueToPlayersAdv(ret,playerID); // zygzyg - nie koloruje, tylko odrobine smieci | ||||
| 			blueToPlayersAdv(ret,playerID,1); | ||||
| 			const CHeroInstance * curh = (const CHeroInstance *)adventureInt->selection.selected; | ||||
| 			printAt(curh->name,75,15,GEOR13,zwykly,ret); | ||||
| 			for (int i=0;i<PRIMARY_SKILLS;i++) | ||||
|   | ||||
| @@ -91,15 +91,23 @@ public: | ||||
| 	bool human; | ||||
| 	int playerID, serialID; | ||||
|  | ||||
| 	virtual void init(CCallback * CB)=0{}; | ||||
| 	virtual void yourTurn()=0{}; | ||||
| 	virtual void heroKilled(const CHeroInstance * hero)=0{}; | ||||
| 	virtual void heroCreated(const CHeroInstance * hero)=0{}; | ||||
|  | ||||
| 	virtual void heroMoved(const HeroMoveDetails & details)=0; | ||||
| }; | ||||
| class CGlobalAI; | ||||
| class CAIHandler | ||||
| { | ||||
| public: | ||||
| 	static CGlobalAI * getNewAI(CCallback * cb, std::string dllname); | ||||
| }; | ||||
| class CGlobalAI : public CGameInterface // AI class (to derivate) | ||||
| { | ||||
| public: | ||||
| 	//CGlobalAI(); | ||||
| 	virtual void yourTurn(){}; | ||||
| 	virtual void heroKilled(const CHeroInstance * hero){}; | ||||
| 	virtual void heroCreated(const CHeroInstance * hero){}; | ||||
| @@ -107,6 +115,7 @@ public: | ||||
| class CPlayerInterface : public CGameInterface | ||||
| { | ||||
| public: | ||||
| 	bool makingTurn; | ||||
| 	SDL_Event * current; | ||||
| 	CAdvMapInt * adventureInt; | ||||
| 	FPSmanager * mainFPSmng; | ||||
|   | ||||
							
								
								
									
										10
									
								
								CMT.cpp
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								CMT.cpp
									
									
									
									
									
								
							| @@ -60,7 +60,7 @@ TTF_Font * TNRB16, *TNR, *GEOR13, *GEORXX, *GEORM; | ||||
|  | ||||
| void initGameState(CGameInfo * cgi) | ||||
| { | ||||
| 	cgi->state->day=1; | ||||
| 	cgi->state->day=0; | ||||
| 	/*********creating players entries in gs****************************************/ | ||||
| 	for (int i=0; i<cgi->scenarioOps.playerInfos.size();i++) | ||||
| 	{ | ||||
| @@ -649,11 +649,9 @@ int _tmain(int argc, _TCHAR* argv[]) | ||||
| 		for (int i=0; i<cgi->scenarioOps.playerInfos.size();i++) //initializing interfaces | ||||
| 		{  | ||||
|  | ||||
| 			//TODO: uncomment when AI will be done | ||||
|  | ||||
| 			//if(cgi->scenarioOps.playerInfos[i].name=="AI") | ||||
| 			//	cgi->playerint.push_back(new CGlobalAI()); | ||||
| 			//else  | ||||
| 			if(cgi->scenarioOps.playerInfos[i].name=="Computer") | ||||
| 				cgi->playerint.push_back(CAIHandler::getNewAI(new CCallback(cgi->state,cgi->scenarioOps.playerInfos[i].color),"EmptyAI.dll")); | ||||
| 			else  | ||||
| 			{ | ||||
| 				cgi->state->currentPlayer=cgi->scenarioOps.playerInfos[i].color; | ||||
| 				cgi->playerint.push_back(new CPlayerInterface(cgi->scenarioOps.playerInfos[i].color,i)); | ||||
|   | ||||
| @@ -8,7 +8,6 @@ | ||||
| #include "CMessage.h" | ||||
| #include <boost/algorithm/string.hpp> | ||||
| #include "hch\CDefHandler.h" | ||||
|  | ||||
| SDL_Surface * CSDL_Ext::newSurface(int w, int h, SDL_Surface * mod) //creates new surface, with flags/format same as in surface given | ||||
| { | ||||
| 	return SDL_CreateRGBSurface(mod->flags,w,h,mod->format->BitsPerPixel,mod->format->Rmask,mod->format->Gmask,mod->format->Bmask,mod->format->Amask); | ||||
| @@ -538,17 +537,34 @@ void CSDL_Ext::blueToPlayers(SDL_Surface * sur, int player) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void CSDL_Ext::blueToPlayersAdv(SDL_Surface * sur, int player) | ||||
| void CSDL_Ext::blueToPlayersAdv(SDL_Surface * sur, int player, int mode, void* additionalInfo) | ||||
| { | ||||
| 	if(player==1) //it is actually blue... | ||||
| 		return; | ||||
| 	if(sur->format->BitsPerPixel == 8) | ||||
| 	{ | ||||
| 		for(int i=0; i<sur->format->palette->ncolors; ++i) | ||||
| 		for(int i=0; i<sur->format->palette->ncolors; ++i) //message, button, avmap, resbar | ||||
| 		{ | ||||
| 			SDL_Color * cc = sur->format->palette->colors+i; | ||||
| 			if(cc->b>cc->g && cc->b>cc->r) | ||||
| 			if( | ||||
| 				((mode==0) && (cc->b>cc->g) && (cc->b>cc->r)) || | ||||
| 				((mode==1) && (cc->r<45) && (cc->b>80) && (cc->g<70) && ((cc->b-cc->r)>40)) || | ||||
| 				((mode==2) && (cc->r<110) && (cc->b>63) && (cc->g<122) && ((cc->b-cc->r)>44) && ((cc->b-cc->g)>32)) | ||||
| 			  ) | ||||
| 			{ | ||||
| 				if ((mode==2) && additionalInfo) | ||||
| 				{ | ||||
| 					for (int vi=0; vi<((std::vector<SDL_Color>*)additionalInfo)->size(); vi++) | ||||
| 					{ | ||||
| 						if  | ||||
| 						  ( | ||||
| 							((*((std::vector<SDL_Color>*)additionalInfo))[vi].r==cc->r) && | ||||
| 							((*((std::vector<SDL_Color>*)additionalInfo))[vi].g==cc->g) && | ||||
| 							((*((std::vector<SDL_Color>*)additionalInfo))[vi].b==cc->b) | ||||
| 						  )	 | ||||
| 							goto main8bitloopend; | ||||
| 					} | ||||
| 				} | ||||
| 				std::vector<long long int> sort1; | ||||
| 				sort1.push_back(cc->r); | ||||
| 				sort1.push_back(cc->g); | ||||
| @@ -569,6 +585,8 @@ void CSDL_Ext::blueToPlayersAdv(SDL_Surface * sur, int player) | ||||
| 					(*sort2[hh].second) = (sort1[hh]*0.8 + sort2[hh].first)/2; | ||||
| 				} | ||||
| 			} | ||||
| main8bitloopend: | ||||
| 			; | ||||
| 		} | ||||
| 	} | ||||
| 	else if(sur->format->BitsPerPixel == 24) | ||||
| @@ -605,7 +623,10 @@ void CSDL_Ext::blueToPlayersAdv(SDL_Surface * sur, int player) | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					if(cp[0]>cp[1] && cp[0]>cp[2]) | ||||
| 					if( | ||||
| 						((mode==0) && (cp[0]>cp[1]) && (cp[0]>cp[2])) || | ||||
| 						((mode==1) && (cp[2]<45) && (cp[0]>80) && (cp[1]<70) && ((cp[0]-cp[1])>40)) | ||||
| 					  ) | ||||
| 					{ | ||||
| 						std::vector<long long int> sort1; | ||||
| 						sort1.push_back(cp[2]); | ||||
|   | ||||
| @@ -31,7 +31,9 @@ namespace CSDL_Ext | ||||
| 	void printAt(std::string text, int x, int y, TTF_Font * font, SDL_Color kolor=tytulowy, SDL_Surface * dst=ekran, unsigned char quality = 2); // quality: 0 - lowest, 1 - medium, 2 - highest | ||||
| 	void update(SDL_Surface * what = ekran); //updates whole surface (default - main screen) | ||||
| 	void blueToPlayers(SDL_Surface * sur, int player); //simple color substitution | ||||
| 	void blueToPlayersAdv(SDL_Surface * sur, int player); //substitute blue color by another one, makes it nicer keeping nuances | ||||
| 	void blueToPlayersAdv(SDL_Surface * sur, int player, int mode=0, void* additionalInfo=NULL); //substitute blue color by another one, makes it nicer keeping nuances | ||||
| 																							//mode 1 is calibrated for hero infobox | ||||
| 																							//mode 2 is calibrated for resbar and gets in additionalInfo a pointer to the set of (SDL_Color) which shouldn't be replaced | ||||
| 	void blueToPlayersNice(SDL_Surface * sur, int player); //uses interface gems to substitute colours | ||||
| 	void setPlayerColor(SDL_Surface * sur, unsigned char player); //sets correct color of flags; -1 for neutral | ||||
| 	std::string processStr(std::string str, std::vector<std::string> & tor); //replaces %s in string | ||||
|   | ||||
		Reference in New Issue
	
	Block a user