Browse Source

choosing random monsters and some artifacts, minor optimalization

mateuszb 18 years ago
parent
commit
0bae692263
1 changed files with 337 additions and 3 deletions
  1. 337 3
      CAmbarCendamo.cpp

+ 337 - 3
CAmbarCendamo.cpp

@@ -7,6 +7,8 @@
 #include "SDL_Extensions.h"
 #include "boost\filesystem.hpp"
 #include <set>
+#include <iomanip>
+#include <sstream>
 #define CGI (CGameInfo::mainObj)
 
 unsigned int intPow(unsigned int a, unsigned int b)
@@ -1939,9 +1941,54 @@ void CAmbarCendamo::processMap(std::vector<std::string> & defsToUnpack)
 	resDefNames.push_back("AVTGEMS0.DEF");
 	resDefNames.push_back("AVTGOLD0.DEF");
 	resDefNames.push_back("ZMITHR.DEF");
+
+	std::vector<int> resDefNumbers;
+	for(int hh=0; hh<resDefNames.size(); ++hh)
+	{
+		resDefNumbers.push_back(-1);
+		for(int k=0; k<map.defy.size(); ++k)
+		{
+			std::string buf = map.defy[k].name;
+			std::transform(buf.begin(), buf.end(), buf.begin(), (int(*)(int))toupper);
+			if(resDefNames[hh] == buf)
+			{
+				resDefNumbers[resDefNumbers.size()-1] = k;
+				break;
+			}
+		}
+	}
+	std::vector<std::string> creDefNames;
+	for(int dd=0; dd<140; ++dd) //we do not use here WoG units
+	{
+		creDefNames.push_back(CGI->dobjinfo->objs[dd+1184].defName);
+	}
+	std::vector<int> creDefNumbers;
+	for(int ee=0; ee<creDefNames.size(); ++ee)
+	{
+		creDefNumbers.push_back(-1);
+	}
+	std::vector<std::string> artDefNames;
+	std::vector<int> artDefNumbers;
+	for(int bb=0; bb<127; ++bb)
+	{
+		if(bb>0 && bb<8)
+			continue;
+		std::ostringstream out;
+		out<<"AVA";
+		out<<std::setw(4)<<std::setfill('0');
+		out<<bb;
+		out<<".DEF";
+		artDefNames.push_back(out.str());
+	}
+	for(int ee=0; ee<artDefNames.size(); ++ee)
+	{
+		artDefNumbers.push_back(-1);
+	}
+
+	//variables initialized
 	for(int j=0; j<CGI->objh->objInstances.size(); ++j)
 	{
-		DefInfo & curDef = map.defy[CGI->objh->objInstances[j].defNumber];
+		DefInfo curDef = map.defy[CGI->objh->objInstances[j].defNumber];
 		switch(getDefType(curDef))
 		{
 		case EDefType::RESOURCE_DEF:
@@ -1951,6 +1998,11 @@ void CAmbarCendamo::processMap(std::vector<std::string> & defsToUnpack)
 					DefInfo nxt = curDef;
 					nxt.bytes[16] = 79;
 					nxt.bytes[20] = rand()%7;
+					if(resDefNumbers[nxt.bytes[20]+1]!=-1)
+					{
+						CGI->objh->objInstances[j].defNumber = resDefNumbers[nxt.bytes[20]+1];
+						continue;
+					}
 					nxt.name = resDefNames[nxt.bytes[20]+1];
 					std::vector<DefObjInfo>::iterator pit = std::find(CGameInfo::mainObj->dobjinfo->objs.begin(), CGameInfo::mainObj->dobjinfo->objs.end(), 
 						nxt.name);
@@ -1966,9 +2018,291 @@ void CAmbarCendamo::processMap(std::vector<std::string> & defsToUnpack)
 					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(resDefNumbers[nxt.bytes[20]+1]==-1)
+					{
+						resDefNumbers[nxt.bytes[20]+1] = map.defy.size()-1;
+					}
 				}
 				break;
 			}
-		}
-	}
+		case EDefType::CREATURES_DEF:
+			{
+				if(curDef.bytes[16]==72) //random monster lvl 1
+				{
+					DefInfo nxt = curDef;
+					nxt.bytes[16] = 54;
+					nxt.bytes[20] = 14*(rand()%9)+rand()%2;
+					if(creDefNumbers[nxt.bytes[20]]!=-1)
+					{
+						CGI->objh->objInstances[j].defNumber = creDefNumbers[nxt.bytes[20]];
+						continue;
+					}
+					nxt.name = creDefNames[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(creDefNumbers[nxt.bytes[20]]==-1)
+					{
+						creDefNumbers[nxt.bytes[20]] = map.defy.size()-1;
+					}
+				}
+				if(curDef.bytes[16]==73) //random monster lvl 2
+				{
+					DefInfo nxt = curDef;
+					nxt.bytes[16] = 54;
+					nxt.bytes[20] = 14*(rand()%9)+rand()%2+2;
+					if(creDefNumbers[nxt.bytes[20]]!=-1)
+					{
+						CGI->objh->objInstances[j].defNumber = creDefNumbers[nxt.bytes[20]];
+						continue;
+					}
+					nxt.name = creDefNames[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(creDefNumbers[nxt.bytes[20]]==-1)
+					{
+						creDefNumbers[nxt.bytes[20]] = map.defy.size()-1;
+					}
+				}
+				if(curDef.bytes[16]==74) //random monster lvl 3
+				{
+					DefInfo nxt = curDef;
+					nxt.bytes[16] = 54;
+					nxt.bytes[20] = 14*(rand()%9)+rand()%2+4;
+					if(creDefNumbers[nxt.bytes[20]]!=-1)
+					{
+						CGI->objh->objInstances[j].defNumber = creDefNumbers[nxt.bytes[20]];
+						continue;
+					}
+					nxt.name = creDefNames[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(creDefNumbers[nxt.bytes[20]]==-1)
+					{
+						creDefNumbers[nxt.bytes[20]] = map.defy.size()-1;
+					}
+				}
+				if(curDef.bytes[16]==75) //random monster lvl 4
+				{
+					DefInfo nxt = curDef;
+					nxt.bytes[16] = 54;
+					nxt.bytes[20] = 14*(rand()%9)+rand()%2+6;
+					if(creDefNumbers[nxt.bytes[20]]!=-1)
+					{
+						CGI->objh->objInstances[j].defNumber = creDefNumbers[nxt.bytes[20]];
+						continue;
+					}
+					nxt.name = creDefNames[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(creDefNumbers[nxt.bytes[20]]==-1)
+					{
+						creDefNumbers[nxt.bytes[20]] = map.defy.size()-1;
+					}
+				}
+				if(curDef.bytes[16]==162) //random monster lvl 5
+				{
+					DefInfo nxt = curDef;
+					nxt.bytes[16] = 54;
+					nxt.bytes[20] = 14*(rand()%9)+rand()%2+8;
+					if(creDefNumbers[nxt.bytes[20]]!=-1)
+					{
+						CGI->objh->objInstances[j].defNumber = creDefNumbers[nxt.bytes[20]];
+						continue;
+					}
+					nxt.name = creDefNames[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(creDefNumbers[nxt.bytes[20]]==-1)
+					{
+						creDefNumbers[nxt.bytes[20]] = map.defy.size()-1;
+					}
+				}
+				if(curDef.bytes[16]==163) //random monster lvl 6
+				{
+					DefInfo nxt = curDef;
+					nxt.bytes[16] = 54;
+					nxt.bytes[20] = 14*(rand()%9)+rand()%2+10;
+					if(creDefNumbers[nxt.bytes[20]]!=-1)
+					{
+						CGI->objh->objInstances[j].defNumber = creDefNumbers[nxt.bytes[20]];
+						continue;
+					}
+					nxt.name = creDefNames[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(creDefNumbers[nxt.bytes[20]]==-1)
+					{
+						creDefNumbers[nxt.bytes[20]] = map.defy.size()-1;
+					}
+				}
+				if(curDef.bytes[16]==164) //random monster lvl 7
+				{
+					DefInfo nxt = curDef;
+					nxt.bytes[16] = 54;
+					nxt.bytes[20] = 14*(rand()%9)+rand()%2+12;
+					if(creDefNumbers[nxt.bytes[20]]!=-1)
+					{
+						CGI->objh->objInstances[j].defNumber = creDefNumbers[nxt.bytes[20]];
+						continue;
+					}
+					nxt.name = creDefNames[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(creDefNumbers[nxt.bytes[20]]==-1)
+					{
+						creDefNumbers[nxt.bytes[20]] = map.defy.size()-1;
+					}
+				}
+				if(curDef.bytes[16]==71) //random monster (any level)
+				{
+					DefInfo nxt = curDef;
+					nxt.bytes[16] = 54;
+					nxt.bytes[20] = rand()%126;
+					if(creDefNumbers[nxt.bytes[20]]!=-1)
+					{
+						CGI->objh->objInstances[j].defNumber = creDefNumbers[nxt.bytes[20]];
+						continue;
+					}
+					nxt.name = creDefNames[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(creDefNumbers[nxt.bytes[20]]==-1)
+					{
+						creDefNumbers[nxt.bytes[20]] = map.defy.size()-1;
+					}
+				}
+				break;
+			} //end of case
+		case EDefType::ARTIFACT_DEF:
+			{
+				if(curDef.bytes[16]==65) //random atrifact (any class)
+				{
+					DefInfo nxt = curDef;
+					nxt.bytes[16] = 5;
+					nxt.bytes[20] = rand()%artDefNames.size();
+					if(artDefNumbers[nxt.bytes[20]]!=-1)
+					{
+						CGI->objh->objInstances[j].defNumber = artDefNumbers[nxt.bytes[20]];
+						continue;
+					}
+					nxt.name = artDefNames[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(artDefNumbers[nxt.bytes[20]]==-1)
+					{
+						artDefNumbers[nxt.bytes[20]] = map.defy.size()-1;
+					}
+				}
+				break;
+			}
+		} //end of main switch
+	} //end of main loop
 }