Преглед изворни кода

* choosing random towns
* some minor bugfixes and improvements

mateuszb пре 18 година
родитељ
комит
95b3ad64d3
8 измењених фајлова са 102 додато и 21 уклоњено
  1. 64 0
      CAmbarCendamo.cpp
  2. 1 1
      CCreatureHandler.cpp
  3. 4 1
      CGameInfo.h
  4. 6 1
      CGameInterface.h
  5. 1 1
      CMT.cpp
  6. 1 15
      CPreGame.h
  7. 23 0
      StartInfo.h
  8. 2 2
      mapHandler.cpp

+ 64 - 0
CAmbarCendamo.cpp

@@ -2011,6 +2011,17 @@ void CAmbarCendamo::processMap(std::vector<std::string> & defsToUnpack)
 		art4DefNumbers.push_back(-1);
 	}
 
+	std::vector<std::string> town0DefNames; //without fort
+	std::vector<int> town0DefNumbers;
+	std::vector<std::string> town1DefNames; //with fort
+	std::vector<int> town1DefNumbers;
+
+	for(int dd=0; dd<9; ++dd)
+	{
+		town1DefNames.push_back(CGI->dobjinfo->objs[dd+385].defName);
+		town1DefNumbers.push_back(-1);
+	}
+	
 	//variables initialized
 	for(int j=0; j<CGI->objh->objInstances.size(); ++j)
 	{
@@ -2449,6 +2460,59 @@ void CAmbarCendamo::processMap(std::vector<std::string> & defsToUnpack)
 				}
 				break;
 			}
+		case EDefType::TOWN_DEF:
+			{
+				if(curDef.bytes[16]==77) //random town
+				{
+					DefInfo nxt = curDef;
+					nxt.bytes[16] = 98;
+					if(((CCastleObjInfo*)CGI->objh->objInstances[j].info)->player==0xff)
+					{
+						nxt.bytes[20] = rand()%town1DefNames.size();		
+					}
+					else
+					{
+						if(CGI->scenarioOps.playerInfos[((CCastleObjInfo*)CGI->objh->objInstances[j].info)->player].castle>-1)
+						{
+							nxt.bytes[20] = CGI->scenarioOps.playerInfos[((CCastleObjInfo*)CGI->objh->objInstances[j].info)->player].castle;
+						}
+						else
+						{
+							nxt.bytes[20] = rand()%town1DefNames.size();
+						}
+					}
+					if(town1DefNumbers[nxt.bytes[20]]!=-1)
+					{
+						CGI->objh->objInstances[j].defNumber = town1DefNumbers[nxt.bytes[20]];
+						continue;
+					}
+					nxt.name = town1DefNames[nxt.bytes[20]];
+					std::vector<DefObjInfo>::iterator pit = std::find(CGameInfo::mainObj->dobjinfo->objs.begin(), CGameInfo::mainObj->dobjinfo->objs.end(), 
+						nxt.name);
+					if(pit == CGameInfo::mainObj->dobjinfo->objs.end())
+					{
+						nxt.isOnDefList = false;
+					}
+					else
+					{
+						nxt.printPriority = pit->priority;
+						nxt.isOnDefList = true;
+					}
+					map.defy.push_back(nxt); // add this def to the vector
+					defsToUnpack.push_back(nxt.name);
+					CGI->objh->objInstances[j].defNumber = map.defy.size()-1;
+					if(town1DefNumbers[nxt.bytes[20]]==-1)
+					{
+						town1DefNumbers[nxt.bytes[20]] = map.defy.size()-1;
+					}
+				}
+				//((CCastleObjInfo*)CGI->objh->objInstances[j].info)
+				break;
+			}
 		} //end of main switch
 	} //end of main loop
+	//for(int j=0; j<CGI->objh->objInstances.size(); ++j) //for creature dwellings on map (they are town type dependent)
+	//{
+	//	DefInfo curDef = map.defy[CGI->objh->objInstances[j].defNumber];
+	//}
 }

+ 1 - 1
CCreatureHandler.cpp

@@ -446,7 +446,7 @@ void CCreatureHandler::loadUnitAnimInfo(CCreature & unit, std::string & src, int
 
 void CCreatureHandler::loadUnitAnimations()
 {
-	std::ifstream inp("CREDEFS.TXT", std::ios::in | std::ios::binary);
+	std::ifstream inp("CREDEFS.TXT", std::ios::in | std::ios::binary); //this file is not in lod
 	inp.seekg(0,std::ios::end); // na koniec
 	int andame = inp.tellg();  // read length
 	inp.seekg(0,std::ios::beg); // wracamy na poczatek

+ 4 - 1
CGameInfo.h

@@ -1,6 +1,8 @@
 #ifndef CGAMEINFO_H
 #define CGAMEINFO_H
 
+#include "CPreGame.h"
+#include "StartInfo.h"
 #include "CSpellHandler.h"
 #include "CAbilityHandler.h"
 #include "CCreaturehandler.h"
@@ -16,8 +18,8 @@
 #include "CTownHandler.h"
 #include "CGeneralTextHandler.h"
 #include "SDL.h"
-#include <vector>
 
+#include <vector>
 /*
 	CGameInfo class
 	for allowing different functions for modifying game informations
@@ -43,6 +45,7 @@ public:
 	CGeneralTextHandler * generaltexth;
 	std::vector<SDL_Color> playerColors;
 	SDL_Color neutralColor;
+	StartInfo scenarioOps;
 };
 
 #endif //CGAMEINFO_H

+ 6 - 1
CGameInterface.h

@@ -1,3 +1,6 @@
+#ifndef CGAMEINTERFACE_H
+#define CGAMEINTERFACE_H
+
 #include "SDL.h"
 #include "CDefHandler.h"
 #include "SDL_Extensions.h"
@@ -59,4 +62,6 @@ class CPlayerInterface
 	std::vector<Hoverable*> hoverable;
 	std::vector<KeyInterested*> keyinterested;
 	void handleEvent(SDL_Event * sEvent);
-};
+};
+
+#endif //CGAMEINTERFACE_H

+ 1 - 1
CMT.cpp

@@ -284,7 +284,7 @@ int _tmain(int argc, _TCHAR* argv[])
 		//CSDL_Ext::blueToPlayersAdv(ll->piecesOfBox[0].ourImages[0].bitmap, 0);
 		//SDL_SaveBMP(ll->piecesOfBox[0].ourImages[0].bitmap, "test2.bmp");
 		cpg->mush = mush;
-		cpg->runLoop();
+		cgi->scenarioOps = cpg->runLoop();
 		THC tmh.getDif();
 
 		//////////////////////////////////////////////////////////////////////////////// lod testing

+ 1 - 15
CPreGame.h

@@ -1,6 +1,7 @@
 #ifndef CPREGAME_H
 #define CPREGAME_H
 #include "SDL.h"
+#include "StartInfo.h"
 #include "CSemiDefHandler.h"
 #include "CSemiLodHandler.h"
 #include "CPreGameTextHandler.h" 
@@ -9,7 +10,6 @@
 #include "CMusicHandler.h"
 class CPreGame;
 extern CPreGame * CPG;
-enum Ebonus {brandom=-1,bartifact, bgold, bresource};
 
 typedef void(CPreGame::*ttt)();
 template <class T=ttt> class CGroup;
@@ -105,20 +105,6 @@ public:
 	CGroup():selected(NULL),type(0){};
 };
 
-struct StartInfo
-{
-	struct PlayerSettings
-	{
-		int castle, hero, heroPortrait; //ID, if -1 then random, if -2 then none
-		std::string heroName;
-		Ebonus bonus; 
-		Ecolor color; //from 0 - 
-		int handicap;//0-no, 1-mild, 2-severe
-		std::string name;
-	};
-	std::vector<PlayerSettings> playerInfos;
-	int turnTime; //in minutes, 0=unlimited
-};
 class PreGameTab
 {
 public:

+ 23 - 0
StartInfo.h

@@ -0,0 +1,23 @@
+#ifndef STARTINFO_H
+#define STARTINFO_H
+
+#include "global.h"
+
+enum Ebonus {brandom=-1,bartifact, bgold, bresource};
+
+struct StartInfo
+{
+	struct PlayerSettings
+	{
+		int castle, hero, heroPortrait; //ID, if -1 then random, if -2 then none
+		std::string heroName;
+		Ebonus bonus; 
+		Ecolor color; //from 0 - 
+		int handicap;//0-no, 1-mild, 2-severe
+		std::string name;
+	};
+	std::vector<PlayerSettings> playerInfos;
+	int turnTime; //in minutes, 0=unlimited
+};
+
+#endif

+ 2 - 2
mapHandler.cpp

@@ -140,7 +140,7 @@ void CMapHandler::init()
 					}
 					if(cDir==8 || cDir==9)
 					{
-						if(j-Hoff+1<reader->map.height && !(reader->map.terrain[i-Woff][j-Hoff+1].malle))
+						if((j-Hoff+1<reader->map.height && !(reader->map.terrain[i-Woff][j-Hoff+1].malle)) || j-Hoff+1==reader->map.height)
 						{
 							roadBitmaps[i][j] = CSDL_Ext::hFlip(roadBitmaps[i][j]);
 							roadBitmaps[i][j] = CSDL_Ext::alphaTransform(roadBitmaps[i][j]);
@@ -222,7 +222,7 @@ void CMapHandler::init()
 						}
 						if(cDir==8 || cDir==9)
 						{
-							if(j-Hoff+1<reader->map.height && !(reader->map.undergroungTerrain[i-Woff][j-Hoff+1].malle))
+							if((j-Hoff+1<reader->map.height && !(reader->map.undergroungTerrain[i-Woff][j-Hoff+1].malle)) || j-Hoff+1==reader->map.height)
 							{
 								undRoadBitmaps[i][j] = CSDL_Ext::hFlip(undRoadBitmaps[i][j]);
 								undRoadBitmaps[i][j] = CSDL_Ext::alphaTransform(undRoadBitmaps[i][j]);