mirror of
				https://github.com/vcmi/vcmi.git
				synced 2025-10-31 00:07:39 +02:00 
			
		
		
		
	
		
			
				
	
	
		
			312 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			312 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include "../stdafx.h"
 | |
| #include "CTownHandler.h"
 | |
| #include "../CGameInfo.h"
 | |
| #include "CLodHandler.h"
 | |
| #include <sstream>
 | |
| #include "CGeneralTextHandler.h"
 | |
| CTownHandler::CTownHandler()
 | |
| {
 | |
| 	smallIcons = CGI->spriteh->giveDef("ITPA.DEF");
 | |
| 	resources = CGI->spriteh->giveDef("RESOURCE.DEF");
 | |
| }
 | |
| CTownHandler::~CTownHandler()
 | |
| {
 | |
| 	delete smallIcons;
 | |
| 	//todo - delete structures info
 | |
| }
 | |
| void CTownHandler::loadNames()
 | |
| {
 | |
| 	std::istringstream ins, names;
 | |
| 	ins.str(CGI->bitmaph->getTextFile("TOWNTYPE.TXT"));
 | |
| 	names.str(CGI->bitmaph->getTextFile("TOWNNAME.TXT"));
 | |
| 	int si=0;
 | |
| 	char bufname[75];
 | |
| 	while (!ins.eof())
 | |
| 	{
 | |
| 		CTown town;
 | |
| 		ins.getline(bufname,50);
 | |
| 		town.name = std::string(bufname);
 | |
| 		town.name = town.name.substr(0,town.name.size()-1);
 | |
| 		for (int i=0; i<NAMES_PER_TOWN; i++)
 | |
| 		{
 | |
| 			names.getline(bufname,50);
 | |
| 			std::string pom(bufname);
 | |
| 			town.names.push_back(pom.substr(0,pom.length()-1));
 | |
| 		}
 | |
| 		town.typeID=si++;
 | |
| 		town.bonus=towns.size();
 | |
| 		if (town.bonus==8) town.bonus=3;
 | |
| 		if (town.name.length())
 | |
| 			towns.push_back(town);
 | |
| 	}
 | |
| 
 | |
| 	std::string  strs = CGI->bitmaph->getTextFile("TCOMMAND.TXT");
 | |
| 	int itr=0;
 | |
| 	while(itr<strs.length()-1)
 | |
| 	{
 | |
| 		std::string tmp;
 | |
| 		CGeneralTextHandler::loadToIt(tmp, strs, itr, 3);
 | |
| 		tcommands.push_back(tmp);
 | |
| 	}
 | |
| 
 | |
| 	strs = CGI->bitmaph->getTextFile("HALLINFO.TXT");
 | |
| 	itr=0;
 | |
| 	while(itr<strs.length()-1)
 | |
| 	{
 | |
| 		std::string tmp;
 | |
| 		CGeneralTextHandler::loadToIt(tmp, strs, itr, 3);
 | |
| 		hcommands.push_back(tmp);
 | |
| 	}
 | |
| 
 | |
| 	//read buildings coords
 | |
| 	std::ifstream of("config/buildings.txt");
 | |
| 	while(!of.eof())
 | |
| 	{
 | |
| 		Structure *vinya = new Structure;
 | |
| 		vinya->group = -1;
 | |
| 		of >> vinya->townID;
 | |
| 		of >> vinya->ID;
 | |
| 		of >> vinya->defName;
 | |
| 		vinya->name = vinya->defName; //TODO - use normal names
 | |
| 		of >> vinya->pos.x;
 | |
| 		of >> vinya->pos.y;
 | |
| 		vinya->pos.z = 0;
 | |
| 		structures[vinya->townID][vinya->ID] = vinya;
 | |
| 	}
 | |
| 	of.close();
 | |
| 	of.clear();
 | |
| 
 | |
| 	//read building priorities
 | |
| 	of.open("config/buildings2.txt");
 | |
| 	int format, idt;
 | |
| 	std::string s;
 | |
| 	of >> format >> idt;
 | |
| 	while(!of.eof())
 | |
| 	{
 | |
| 		std::map<int,std::map<int, Structure*> >::iterator i;
 | |
| 		std::map<int, Structure*>::iterator i2;
 | |
| 		int itr=1, buildingID;
 | |
| 		int castleID;
 | |
| 		of >> s;
 | |
| 		if (s != "CASTLE")
 | |
| 			break;
 | |
| 		of >> castleID;
 | |
| 		while(1)
 | |
| 		{
 | |
| 			of >> s;
 | |
| 			if (s == "END")
 | |
| 				break;
 | |
| 			else
 | |
| 				if((i=structures.find(castleID))!=structures.end())
 | |
| 					if((i2=(i->second.find(buildingID=atoi(s.c_str()))))!=(i->second.end()))
 | |
| 						i2->second->pos.z=itr++;
 | |
| 					else
 | |
| 						std::cout << "Warning1: No building "<<buildingID<<" in the castle "<<castleID<<std::endl;
 | |
| 				else
 | |
| 					std::cout << "Warning1: Castle "<<castleID<<" not defined."<<std::endl;
 | |
| 		}
 | |
| 	}
 | |
| 	of.close();
 | |
| 	of.clear();
 | |
| 
 | |
| 	//read borders and areas names
 | |
| 	of.open("config/buildings3.txt");
 | |
| 	while(!of.eof())
 | |
| 	{
 | |
| 		std::map<int,std::map<int, Structure*> >::iterator i;
 | |
| 		std::map<int, Structure*>::iterator i2;
 | |
| 		int town, id;
 | |
| 		std::string border, area;
 | |
| 		of >> town >> id >> border >> border >> area;
 | |
| 
 | |
| 		if((i=structures.find(town))!=structures.end())
 | |
| 			if((i2=(i->second.find(id)))!=(i->second.end()))
 | |
| 			{
 | |
| 				i2->second->borderName = border;
 | |
| 				i2->second->areaName = area;
 | |
| 			}
 | |
| 			else
 | |
| 				std::cout << "Warning2: No building "<<id<<" in the castle "<<town<<std::endl;
 | |
| 		else
 | |
| 			std::cout << "Warning2: Castle "<<town<<" not defined."<<std::endl;
 | |
| 
 | |
| 	}
 | |
| 	of.close();
 | |
| 	of.clear();
 | |
| 
 | |
| 	//read groups
 | |
| 	itr = 0;
 | |
| 	of.open("config/buildings4.txt");
 | |
| 	of >> format;
 | |
| 	if(format!=1)
 | |
| 	{
 | |
| 		std::cout << "Unhandled format of buildings4.txt \n";
 | |
| 	}
 | |
| 	else
 | |
| 	{
 | |
| 		of >> s;
 | |
| 		int itr=1;
 | |
| 		while(!of.eof())
 | |
| 		{
 | |
| 			std::map<int,std::map<int, Structure*> >::iterator i;
 | |
| 			std::map<int, Structure*>::iterator i2;
 | |
| 			int buildingID;
 | |
| 			int castleID;
 | |
| 			itr++;
 | |
| 			if (s == "CASTLE")
 | |
| 			{
 | |
| 				of >> castleID;
 | |
| 			}
 | |
| 			else if(s == "ALL")
 | |
| 			{
 | |
| 				castleID = -1;
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				break;
 | |
| 			}
 | |
| 			of >> s;
 | |
| 			while(1) //read groups for castle
 | |
| 			{
 | |
| 				if (s == "GROUP")
 | |
| 				{
 | |
| 					while(1)
 | |
| 					{
 | |
| 						of >> s;
 | |
| 						if((s == "GROUP") || (s == "EOD") || (s == "CASTLE")) //
 | |
| 							break;
 | |
| 						buildingID = atoi(s.c_str());
 | |
| 						if(castleID>=0)
 | |
| 						{
 | |
| 							if((i=structures.find(castleID))!=structures.end())
 | |
| 								if((i2=(i->second.find(buildingID)))!=(i->second.end()))
 | |
| 									i2->second->group = itr;
 | |
| 								else
 | |
| 									std::cout << "Warning3: No building "<<buildingID<<" in the castle "<<castleID<<std::endl;
 | |
| 							else
 | |
| 								std::cout << "Warning3: Castle "<<castleID<<" not defined."<<std::endl;
 | |
| 						}
 | |
| 						else //set group for selected building in ALL castles
 | |
| 						{
 | |
| 							for(i=structures.begin();i!=structures.end();i++)
 | |
| 							{
 | |
| 								for(i2=i->second.begin(); i2!=i->second.end(); i2++)
 | |
| 								{
 | |
| 									if(i2->first == buildingID)
 | |
| 									{
 | |
| 										i2->second->group = itr;
 | |
| 										break;
 | |
| 									}
 | |
| 								}
 | |
| 							}
 | |
| 						}
 | |
| 					}
 | |
| 					if(s == "CASTLE")
 | |
| 						break;
 | |
| 					itr++;
 | |
| 				}//if (s == "GROUP")
 | |
| 				else if(s == "EOD")
 | |
| 					break;
 | |
| 			}
 | |
| 		}
 | |
| 		of.close();
 | |
| 		of.clear();
 | |
| 
 | |
| 		for(int x=0;x<towns.size();x++)
 | |
| 			towns[x].basicCreatures.resize(7);
 | |
| 
 | |
| 		of.open("config/basicCres.txt");
 | |
| 		while(!of.eof())
 | |
| 		{
 | |
| 			int tid, lid, cid; //town,level,creature
 | |
| 			of >> tid >> lid >> cid;
 | |
| 			if(lid < towns[tid].basicCreatures.size())
 | |
| 				towns[tid].basicCreatures[lid]=cid;
 | |
| 		}
 | |
| 		of.close();
 | |
| 		of.clear();
 | |
| 
 | |
| 		for(int x=0;x<towns.size();x++)
 | |
| 			towns[x].upgradedCreatures.resize(7);
 | |
| 
 | |
| 		of.open("config/creatures_upgr.txt");
 | |
| 		while(!of.eof())
 | |
| 		{
 | |
| 			int tid, lid, cid; //town,level,creature
 | |
| 			of >> tid >> lid >> cid;
 | |
| 			if(lid < towns[tid].upgradedCreatures.size())
 | |
| 				towns[tid].upgradedCreatures[lid]=cid;
 | |
| 		}
 | |
| 		of.close();
 | |
| 		of.clear();
 | |
| 
 | |
| 		of.open("config/building_horde.txt");
 | |
| 		while(!of.eof())
 | |
| 		{
 | |
| 			int tid, lid, cid; //town,horde serial,creature level
 | |
| 			of >> tid >> lid >> cid;
 | |
| 			towns[tid].hordeLvl[--lid] = cid;
 | |
| 		}
 | |
| 		of.close();
 | |
| 		of.clear();
 | |
| 
 | |
| 		of.open("config/requirements.txt");
 | |
| 		while(!of.eof())
 | |
| 		{
 | |
| 			int ile, town, build, pom;
 | |
| 			of >> ile;
 | |
| 			for(int i=0;i<ile;i++)
 | |
| 			{
 | |
| 				of >> town;
 | |
| 				while(true)
 | |
| 				{
 | |
| 					of.getline(bufname,75);if(!(*bufname))of.getline(bufname,75);
 | |
| 					std::istringstream ifs(bufname);
 | |
| 					ifs >> build;
 | |
| 					if(build<0)
 | |
| 						break;
 | |
| 					while(!ifs.eof())
 | |
| 					{
 | |
| 						ifs >> pom;
 | |
| 						requirements[town][build].insert(pom);
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 		of.close();
 | |
| 		of.clear();
 | |
| 	}
 | |
| }
 | |
| SDL_Surface * CTownHandler::getPic(int ID, bool fort, bool builded)
 | |
| {
 | |
| 	if (ID==-1)
 | |
| 		return smallIcons->ourImages[0].bitmap;
 | |
| 	else if (ID==-2)
 | |
| 		return smallIcons->ourImages[1].bitmap;
 | |
| 	else if (ID==-3)
 | |
| 		return smallIcons->ourImages[2+F_NUMBER*4].bitmap;
 | |
| 	else if (ID>F_NUMBER || ID<-3)
 | |
| #ifndef __GNUC__
 | |
| 		throw new std::exception("Invalid ID");
 | |
| #else
 | |
| 		throw new std::exception();
 | |
| #endif
 | |
| 	else
 | |
| 	{
 | |
| 		int pom = 3;
 | |
| 		if(!fort)
 | |
| 			pom+=F_NUMBER*2;
 | |
| 		pom += ID*2;
 | |
| 		if (!builded)
 | |
| 			pom--;
 | |
| 		return smallIcons->ourImages[pom].bitmap;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| int CTownHandler::getTypeByDefName(std::string name)
 | |
| {
 | |
| 	//TODO
 | |
| 	return 0;
 | |
| }
 | |
| 
 |