diff --git a/AI/EmptyAI/CEmptyAI.cpp b/AI/EmptyAI/CEmptyAI.cpp index 8f98d4bf0..345659259 100644 --- a/AI/EmptyAI/CEmptyAI.cpp +++ b/AI/EmptyAI/CEmptyAI.cpp @@ -11,10 +11,10 @@ void CEmptyAI::init(ICallback * CB) void CEmptyAI::yourTurn() { } -void CEmptyAI::heroKilled(const CHeroInstance *) +void CEmptyAI::heroKilled(const CGHeroInstance *) { } -void CEmptyAI::heroCreated(const CHeroInstance *) +void CEmptyAI::heroCreated(const CGHeroInstance *) { } void CEmptyAI::heroMoved(const HeroMoveDetails &) diff --git a/AI/EmptyAI/CEmptyAI.h b/AI/EmptyAI/CEmptyAI.h index 16247b928..d5ad45da7 100644 --- a/AI/EmptyAI/CEmptyAI.h +++ b/AI/EmptyAI/CEmptyAI.h @@ -6,8 +6,8 @@ class CEmptyAI : public CGlobalAI public: void init(ICallback * CB); void yourTurn(); - void heroKilled(const CHeroInstance *); - void heroCreated(const CHeroInstance *); + void heroKilled(const CGHeroInstance *); + void heroCreated(const CGHeroInstance *); void heroMoved(const HeroMoveDetails &); void heroPrimarySkillChanged(const CGHeroInstance * hero, int which, int val) {}; void showSelDialog(std::string text, std::vector & components, int askID){}; diff --git a/CLua.cpp b/CLua.cpp index 650e42780..a692e8e56 100644 --- a/CLua.cpp +++ b/CLua.cpp @@ -19,6 +19,7 @@ #include "CPlayerInterface.h" #include #include +#include "hch/CDefObjInfoHandler.h" #pragma warning (disable : 4311) bool getGlobalFunc(lua_State * L, std::string fname) { diff --git a/CMT.cpp b/CMT.cpp index 00b491705..ec9039fba 100644 --- a/CMT.cpp +++ b/CMT.cpp @@ -57,7 +57,7 @@ #endif #define CHUNK 16384 -const char * NAME = "VCMI 0.51 \"Tirion\" Techdemo"; +const char * NAME = "VCMI 0.52 \"Tirion\" Techdemo"; SDL_Surface * ekran, * screen, * screen2; TTF_Font * TNRB16, *TNR, *GEOR13, *GEORXX, *GEORM, *GEOR16; @@ -82,7 +82,7 @@ void initGameState(CGameInfo * cgi) cgi->state->players.insert(ins); } /******************RESOURCES****************************************************/ - //TODO: zeby komputer dostawal inaczej niz gracz + //TODO: zeby komputer dostawal inaczej niz gracz std::vector startres; std::ifstream tis("config/startres.txt"); int k; @@ -814,7 +814,10 @@ int _tmain(int argc, _TCHAR* argv[]) for (int i=0;iplayerint.size();i++) { cgi->state->currentPlayer=cgi->playerint[i]->playerID; - cgi->playerint[i]->yourTurn(); + try + { + cgi->playerint[i]->yourTurn(); + }HANDLE_EXCEPTION } } } diff --git a/CPathfinder.cpp b/CPathfinder.cpp index 1cbe72b3b..2aaf08f32 100644 --- a/CPathfinder.cpp +++ b/CPathfinder.cpp @@ -174,6 +174,9 @@ CPath * CPathfinder::getPath(int3 src, int3 dest, const CGHeroInstance * hero, u } CPathNode * curNode = graph[dest.x][dest.y]; + if(!curNode->theNodeBefore) + return NULL; + CPath * ret = new CPath; while(curNode!=graph[src.x][src.y] && curNode != NULL) diff --git a/config/basicCres.txt b/config/basicCres.txt new file mode 100644 index 000000000..e7650481b --- /dev/null +++ b/config/basicCres.txt @@ -0,0 +1,72 @@ +0 0 0 +0 1 2 +0 2 4 +0 3 6 +0 4 8 +0 5 10 +0 6 12 +0 7 150 +1 0 14 +1 1 16 +1 2 18 +1 3 20 +1 4 22 +1 5 24 +1 6 26 +1 7 151 +2 0 28 +2 1 30 +2 2 32 +2 3 34 +2 4 36 +2 5 38 +2 6 40 +2 7 152 +3 0 42 +3 1 44 +3 2 46 +3 3 48 +3 4 50 +3 5 52 +3 6 54 +3 7 153 +4 0 56 +4 1 58 +4 2 60 +4 3 62 +4 4 64 +4 5 66 +4 6 68 +4 7 154 +5 0 70 +5 1 72 +5 2 74 +5 3 76 +5 4 78 +5 5 80 +5 6 82 +5 7 155 +6 0 84 +6 1 86 +6 2 88 +6 3 90 +6 4 92 +6 5 94 +6 6 96 +6 7 156 +7 0 98 +7 1 100 +7 2 104 +7 3 106 +7 4 102 +7 5 108 +7 6 110 +7 7 157 +8 0 118 +8 1 112 +8 2 115 +8 3 114 +8 4 113 +8 5 120 +8 6 130 +8 7 158 diff --git a/config/cregens.txt b/config/cregens.txt new file mode 100644 index 000000000..ff19e7018 --- /dev/null +++ b/config/cregens.txt @@ -0,0 +1,99 @@ +56 0 +57 2 +25 4 +58 6 +35 8 +5 10 +8 12 +80 150 +6 14 +12 16 +15 18 +50 20 +45 22 +51 24 +24 26 +81 151 +43 28 +17 30 +31 34 +18 36 +36 38 +44 40 +82 152 +29 42 +22 44 +27 46 +37 48 +40 50 +14 52 +10 54 +83 153 +54 56 +55 58 +48 60 +53 62 +52 64 +3 66 +4 68 +84 154 +46 70 +26 72 +2 74 +33 76 +34 78 +32 80 +41 82 +85 155 +21 84 +19 86 +39 88 +38 90 +42 92 +9 94 +1 96 +86 156 +20 98 +30 100 +11 104 +0 106 +23 102 +49 108 +28 110 +87 157 +59 118 +07 112 +69 112 +47 115 +72 115 +16 114 +71 114 +13 113 +70 113 +60 120 +61 130 +88 158 +74 139 +73 138 +75 140 +78 143 +77 142 +76 141 +67 137 +79 144 +66 136 +64 134 +65 135 +63 133 +62 132 +89 171 +90 170 +91 168 +92 172 +94 169 +95 173 +96 192 +97 193 +98 194 +99 195 +100 196 \ No newline at end of file diff --git a/config/monsters.txt b/config/monsters.txt new file mode 100644 index 000000000..2f2798291 --- /dev/null +++ b/config/monsters.txt @@ -0,0 +1,197 @@ +0 1 +1 1 +2 2 +3 2 +4 3 +5 3 +6 4 +7 4 +8 5 +9 5 +10 6 +11 6 +12 7 +13 7 +14 1 +15 1 +16 2 +17 2 +18 3 +19 3 +20 4 +21 4 +22 5 +23 5 +24 6 +25 6 +26 7 +27 7 +28 1 +29 1 +30 2 +31 2 +32 3 +33 3 +34 4 +35 4 +36 5 +37 5 +38 6 +39 6 +40 7 +41 7 +42 1 +43 1 +44 2 +45 2 +46 3 +47 3 +48 4 +49 4 +50 5 +51 5 +52 6 +53 6 +54 7 +55 7 +56 1 +57 1 +58 2 +59 2 +60 3 +61 3 +62 4 +63 4 +64 5 +65 5 +66 6 +67 6 +68 7 +69 7 +70 1 +71 1 +72 2 +73 2 +74 3 +75 3 +76 4 +77 4 +78 5 +79 5 +80 6 +81 6 +82 7 +83 7 +84 1 +85 1 +86 2 +87 2 +88 3 +89 3 +90 4 +91 4 +92 5 +93 5 +94 6 +95 6 +96 7 +97 7 +98 1 +99 1 +100 2 +101 2 +102 3 +103 3 +104 4 +105 4 +106 5 +107 5 +108 6 +109 6 +110 7 +111 7 +112 2 +113 5 +114 4 +115 3 +116 4 +117 5 +118 1 +119 1 +120 6 +121 6 +122 000000 +123 3 +124 000000 +125 5 +126 000000 +127 2 +128 000000 +129 4 +130 7 +131 7 +132 10 +133 10 +134 8 +135 10 +136 6 +137 4 +138 1 +139 1 +140 2 +141 3 +142 3 +143 2 +144 5 +145 000000 +146 000000 +147 000000 +148 000000 +149 000000 +150 000000 +151 8 +152 8 +153 8 +154 8 +155 8 +156 8 +157 8 +158 8 +159 000000 +160 000000 +161 000000 +162 000000 +163 000000 +164 000000 +165 000000 +166 000000 +167 000000 +168 000000 +169 000000 +170 000000 +171 000000 +172 000000 +173 000000 +174 000000 +175 000000 +176 000000 +177 000000 +178 000000 +179 000000 +180 000000 +181 000000 +182 000000 +183 000000 +184 000000 +185 000000 +186 000000 +187 000000 +188 000000 +189 000000 +190 000000 +191 000000 +192 000000 +193 000000 +194 000000 +195 000000 +196 000000 diff --git a/config/townsDefs.txt b/config/townsDefs.txt new file mode 100644 index 000000000..3414b29c2 --- /dev/null +++ b/config/townsDefs.txt @@ -0,0 +1,19 @@ +8 +AVCCAST0.DEF +AVCRAMP0.DEF +AVCTOWR0.DEF +AVCINFT0.DEF +AVCNECR0.DEF +AVCDUNG0.DEF +AVCSTRO0.DEF +AVCFTRT0.DEF +AVCHFOR0.DEF +AVCCASZ0.DEF +AVCRAMZ0.DEF +AVCTOWZ0.DEF +AVCINFZ0.DEF +AVCNECZ0.DEF +AVCDUNZ0.DEF +AVCSTRZ0.DEF +AVCFORZ0.DEF +AVCHFORZ0.DEF \ No newline at end of file diff --git a/hch/CAmbarCendamo.cpp b/hch/CAmbarCendamo.cpp index 263829ef8..deff94a59 100644 --- a/hch/CAmbarCendamo.cpp +++ b/hch/CAmbarCendamo.cpp @@ -15,6 +15,17 @@ #include #include "../CLua.h" +int readInt(unsigned char * bufor, int bytCon) +{ + int ret=0; + int amp=1; + for (int i=0; i(nt))) = *nobj; delete nobj; nobj = nt; - + nt->identifier = readInt(spec->bytes,4);; if(spec->unusualBuildins) { - //nt->builtBuildings.insert(10); - //for(int ir = 0; ir < 6; ir++) - //{ - // for(int bs=0;bs<8;bs++) - // { - // if(ir==0) - // { - // if (bs<3) - // { - // if(spec->buildingSettings[ir] & (1<builtBuildings.insert(11+bs); - // } - // } - // else if (bs<6) - // { - // if(spec->buildingSettings[ir] & (1<builtBuildings.insert(7+bs-3); - // } - // } - // else if(bs==6) - // { - // if(spec->buildingSettings[ir] & (1<builtBuildings.insert(5); - // } - // } - // else// if(bs==7) - // { - // if(spec->buildingSettings[ir] & (1<builtBuildings.insert(16); - // } - // } - // } //if(ir==0) - // else if(ir==1) - // { - // if(bs<2) - // { - // if(spec->buildingSettings[ir] & (1<builtBuildings.insert(14+bs); - // } - // } - // else if (bs==2) - // { - // if(spec->buildingSettings[ir] & (1<buildingSettings[ir] & (1<builtBuildings.insert(0+bs-3); - // } - // } - - // }//else if(ir==1) - // else if(ir==2) - // { - // if(bs==0) - // { - // if(spec->buildingSettings[ir] & (1<builtBuildings.insert(6); //stocznia - // } - // } - // else if(bs==1) - // { - // if(spec->buildingSettings[ir] & (1<builtBuildings.insert(26); //grail - // } - // } - // else if(bs==2) - // { - // if(spec->buildingSettings[ir] & (1<builtBuildings.insert(17); //latarnia - // } - // } - // else if(bs==3) - // { - // if(spec->buildingSettings[ir] & (1<builtBuildings.insert(22); //bractwo miecza - // } - // } - // else if(bs==4) - // { - // if(spec->buildingSettings[ir] & (1<builtBuildings.insert(21); //stables - // } - // } - // else if(bs==5) - // { - // if(spec->buildingSettings[ir] & (1<buildingSettings[ir] & (1<builtBuildings.insert(30); //gen1 - // } - // } - // else if(bs==7) - // { - // if(spec->buildingSettings[ir] & (1<builtBuildings.insert(37); //gen1+ - // } - // } - // }//else if(ir==2) - // else if (ir==3) - // { - // if(bs==0) - // { - - // //horda dla 1 poziomu??? - // if(spec->buildingSettings[ir] & (1<buildingSettings[ir] & (1<builtBuildings.insert(31); //gen2 - // } - // } - // else - // { - // if(spec->buildingSettings[ir] & (1<builtBuildings.insert(38); //gen2+ - // } - // } - // } - // else if (bs==3) - // { - // if(spec->buildingSettings[ir] & (1<builtBuildings.find(38)!=nt->builtBuildings.end()) - // nt->builtBuildings.insert(19); - // else - // nt->builtBuildings.insert(18); - // } - // continue; - // } - // else if(bs==4) - // { - // if(bs%2) //nieulepszone - // { - // if(spec->buildingSettings[ir] & (1<builtBuildings.insert((int)(39+(bs/2)-2)); - // } - // } - // else - // { - // if(spec->buildingSettings[ir] & (1<builtBuildings.insert(32+(bs/2)-2); - // } - // } - // } - - // }//else if (ir==3) - // else if (ir==4 && bs==0) - // { - // if(spec->buildingSettings[ir] & 1<<0) - // nt->builtBuildings.insert(40); - // if(spec->buildingSettings[ir] & 1<<2) - // nt->builtBuildings.insert(34); - // if(spec->buildingSettings[ir] & 1<<3) - // nt->builtBuildings.insert(41); - // if(spec->buildingSettings[ir] & 1<<4) - // { - // if(nt->builtBuildings.find(41)!=nt->builtBuildings.end()) - // nt->builtBuildings.insert(25); - // else - // nt->builtBuildings.insert(24); - // } - // if(spec->buildingSettings[ir] & 1<<5) - // nt->builtBuildings.insert(35); - // if(spec->buildingSettings[ir] & 1<<6) - // nt->builtBuildings.insert(42); - // if(spec->buildingSettings[ir] & 1<<7) - // nt->builtBuildings.insert(36); - // }//else if (ir==4) - // else if (ir==5) - // { - // if(bs==0) - // { - // if(spec->buildingSettings[ir] & (1<builtBuildings.insert(43); //gen7+ - // } - // } - // }//else if (ir==5) - // } - //} - - //testowe zczytywanie h3mowych ID for(int byte=0;byte<6;byte++) { for(int bit=0;bit<8;bit++) @@ -2057,13 +1852,9 @@ void CAmbarCendamo::deh3m() case EDefType::CREGEN_DEF: { CCreGenObjInfo * spec = new CCreGenObjInfo; - spec->player = bufor[i]; ++i; - i+=3; - for(int ggg=0; ggg<4; ++ggg) - { - spec->bytes[ggg] = bufor[i]; ++i; - } - if((spec->bytes[0] == '\0') && (spec->bytes[1] == '\0') && (spec->bytes[2] == '\0') && (spec->bytes[3] == '\0')) + spec->player = readNormalNr(i); i+=4; + spec->identifier = readNormalNr(i); i+=4; + if(!spec->identifier) { spec->asCastle = false; spec->castles[0] = bufor[i]; ++i; @@ -2080,13 +1871,9 @@ void CAmbarCendamo::deh3m() case EDefType::CREGEN2_DEF: { CCreGen2ObjInfo * spec = new CCreGen2ObjInfo; - spec->player = bufor[i]; ++i; - i+=3; - for(int ggg=0; ggg<4; ++ggg) - { - spec->bytes[ggg] = bufor[i]; ++i; - } - if((spec->bytes[0] == '\0') && (spec->bytes[1] == '\0') && (spec->bytes[2] == '\0') && (spec->bytes[3] == '\0')) + spec->player = readNormalNr(i); i+=4; + spec->identifier = readNormalNr(i); i+=4; + if(!spec->identifier) { spec->asCastle = false; spec->castles[0] = bufor[i]; ++i; @@ -2098,10 +1885,10 @@ void CAmbarCendamo::deh3m() } spec->minLevel = bufor[i]; ++i; spec->maxLevel = bufor[i]; ++i; - if(spec->maxLevel>7) - spec->maxLevel = 7; - if(spec->minLevel<1) - spec->minLevel = 1; + //if(spec->maxLevel>7) + // spec->maxLevel = 7; + //if(spec->minLevel<1) + // spec->minLevel = 1; nobj->setOwner(spec->player); nobj->info = spec; break; @@ -2344,7 +2131,14 @@ borderguardend: THC std::cout<<"\tUnpacking defs: "<handler=dhandlers[i]; + CGDefInfo* pom = CGI->dobjinfo->gobjs[map.defy[i]->id][map.defy[i]->subid]; + if(pom) + pom->handler=dhandlers[i]; + else + std::cout << "Lacking def info for " << map.defy[i]->id << " " << map.defy[i]->subid <<" " << map.defy[i]->name << std::endl; + } for(int vv=0; vvhandler->alphaTransformed) @@ -2654,672 +2448,4 @@ CCreatureSet CAmbarCendamo::readCreatureSet(int pos, int number) } void CAmbarCendamo::processMap(std::vector & defsToUnpack) -{ - resDefNames.push_back("AVTRNDM0.DEF"); - resDefNames.push_back("AVTWOOD0.DEF"); - resDefNames.push_back("AVTMERC0.DEF"); - resDefNames.push_back("AVTORE0.DEF"); - resDefNames.push_back("AVTSULF0.DEF"); - resDefNames.push_back("AVTCRYS0.DEF"); - resDefNames.push_back("AVTGEMS0.DEF"); - resDefNames.push_back("AVTGOLD0.DEF"); - resDefNames.push_back("ZMITHR.DEF"); - - std::vector resDefNumbers; - for(int hh=0; hhname; - std::transform(buf.begin(), buf.end(), buf.begin(), (int(*)(int))toupper); - if(resDefNames[hh] == buf) - { - resDefNumbers[resDefNumbers.size()-1] = map.defy[k]; - break; - } - } - } - std::vector 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 creDefNumbers; - for(int ee=0; ee artDefNames; - std::vector artDefNumbers; - for(int bb=0; bb<162; ++bb) - { - if(CGI->arth->artifacts[CGI->dobjinfo->objs[bb+213].subtype].aClass!=EartClass::SartClass) - artDefNames.push_back(CGI->dobjinfo->objs[bb+213].defName); - } - for(int ee=0; ee art1DefNames; - std::vector art1DefNumbers; - for(int bb=0; bb<162; ++bb) - { - if(CGI->arth->artifacts[CGI->dobjinfo->objs[bb+213].subtype].aClass==EartClass::TartClass) - art1DefNames.push_back(CGI->dobjinfo->objs[bb+213].defName); - } - for(int ee=0; ee art2DefNames; - std::vector art2DefNumbers; - for(int bb=0; bb<162; ++bb) - { - if(CGI->arth->artifacts[CGI->dobjinfo->objs[bb+213].subtype].aClass==EartClass::NartClass) - art2DefNames.push_back(CGI->dobjinfo->objs[bb+213].defName); - } - for(int ee=0; ee art3DefNames; - std::vector art3DefNumbers; - for(int bb=0; bb<162; ++bb) - { - if(CGI->arth->artifacts[CGI->dobjinfo->objs[bb+213].subtype].aClass==EartClass::JartClass) - art3DefNames.push_back(CGI->dobjinfo->objs[bb+213].defName); - } - for(int ee=0; ee art4DefNames; - std::vector art4DefNumbers; - for(int bb=0; bb<162; ++bb) - { - if(CGI->arth->artifacts[CGI->dobjinfo->objs[bb+213].subtype].aClass==EartClass::RartClass) - art4DefNames.push_back(CGI->dobjinfo->objs[bb+213].defName); - } - for(int ee=0; ee town0DefNames; //without fort - std::vector town0DefNumbers; - std::vector town1DefNames; //with fort - std::vector town1DefNumbers; - - for(int dd=0; dddobjinfo->objs[dd+385].defName); - town1DefNumbers.push_back(NULL); - } - - std::vector< std::vector > creGenNames; - std::vector< std::vector > creGenNumbers; - creGenNames.resize(F_NUMBER); - creGenNumbers.resize(F_NUMBER); - - for(int ff=0; ffdobjinfo->objs[395+7*ff+dd].defName); - creGenNumbers[ff].push_back(NULL); - } - } - - for(int dd=0; dd<7; ++dd) - { - creGenNumbers[8].push_back(NULL); - } - - creGenNames[F_NUMBER-1].push_back(CGI->dobjinfo->objs[457].defName); - creGenNames[F_NUMBER-1].push_back(CGI->dobjinfo->objs[452].defName); - creGenNames[F_NUMBER-1].push_back(CGI->dobjinfo->objs[455].defName); - creGenNames[F_NUMBER-1].push_back(CGI->dobjinfo->objs[454].defName); - creGenNames[F_NUMBER-1].push_back(CGI->dobjinfo->objs[453].defName); - creGenNames[F_NUMBER-1].push_back(CGI->dobjinfo->objs[458].defName); - creGenNames[F_NUMBER-1].push_back(CGI->dobjinfo->objs[459].defName); - - for(int b=0; bscenarioOps.playerInfos.size(); ++b) // choosing random player alignment - { - if(CGI->scenarioOps.playerInfos[b].castle==-1) - CGI->scenarioOps.playerInfos[b].castle = rand()%F_NUMBER; - } - - //variables initialized - for(int j=0; jobjh->objInstances.size(); ++j) - { - CGDefInfo * curDef = CGI->objh->objInstances[j]->defInfo; - switch(getDefType(curDef)) - { - case EDefType::RESOURCE_DEF: - { - if(curDef->id==76) //resource to specify - { - CGDefInfo * nxt = curDef; - nxt->id = 79; - nxt->subid = rand()%7; - if(resDefNumbers[nxt->subid+1]!=NULL) - { - CGI->objh->objInstances[j]->defInfo = resDefNumbers[nxt->subid+1]; - continue; - } - nxt->name = resDefNames[nxt->subid+1]; - map.defy.push_back(nxt); // add this def to the vector - defsToUnpack.push_back(nxt->name); - CGI->objh->objInstances[j]->defInfo = nxt; - if(resDefNumbers[nxt->subid+1]==NULL) - { - resDefNumbers[nxt->subid+1] = nxt; - } - } - break; - } - case EDefType::CREATURES_DEF: - { - if(curDef->id==72) //random monster lvl 1 - { - CGDefInfo * nxt = curDef; - nxt->id = 54; - nxt->subid = 14*(rand()%9)+rand()%2; - if(creDefNumbers[nxt->subid]!=NULL) - { - CGI->objh->objInstances[j]->defInfo = creDefNumbers[nxt->subid]; - continue; - } - nxt->name = creDefNames[nxt->subid]; - map.defy.push_back(nxt); // add this def to the vector - defsToUnpack.push_back(nxt->name); - CGI->objh->objInstances[j]->defInfo = nxt; - if(creDefNumbers[nxt->subid]==NULL) - { - creDefNumbers[nxt->subid] = nxt; - } - } - if(curDef->id==73) //random monster lvl 2 - { - CGDefInfo * nxt = curDef; - nxt->id = 54; - nxt->subid = 14*(rand()%9)+rand()%2+2; - if(creDefNumbers[nxt->subid]!=NULL) - { - CGI->objh->objInstances[j]->defInfo = creDefNumbers[nxt->subid]; - continue; - } - nxt->name = creDefNames[nxt->subid]; - map.defy.push_back(nxt); // add this def to the vector - defsToUnpack.push_back(nxt->name); - CGI->objh->objInstances[j]->defInfo = nxt; - if(creDefNumbers[nxt->subid]==NULL) - { - creDefNumbers[nxt->subid] = nxt; - } - } - if(curDef->id==74) //random monster lvl 3 - { - CGDefInfo *nxt = curDef; - nxt->id = 54; - nxt->subid = 14*(rand()%9)+rand()%2+4; - if(creDefNumbers[nxt->subid]!=NULL) - { - CGI->objh->objInstances[j]->defInfo = creDefNumbers[nxt->subid]; - continue; - } - nxt->name = creDefNames[nxt->subid]; - map.defy.push_back(nxt); // add this def to the vector - defsToUnpack.push_back(nxt->name); - CGI->objh->objInstances[j]->defInfo = nxt; - if(creDefNumbers[nxt->subid]==NULL) - { - creDefNumbers[nxt->subid] = nxt; - } - } - if(curDef->id==75) //random monster lvl 4 - { - CGDefInfo * nxt = curDef; - nxt->id = 54; - nxt->subid = 14*(rand()%9)+rand()%2+6; - if(creDefNumbers[nxt->subid]!=NULL) - { - CGI->objh->objInstances[j]->defInfo = creDefNumbers[nxt->subid]; - continue; - } - nxt->name = creDefNames[nxt->subid]; - map.defy.push_back(nxt); // add this def to the vector - defsToUnpack.push_back(nxt->name); - CGI->objh->objInstances[j]->defInfo = nxt; - if(creDefNumbers[nxt->subid]==NULL) - { - creDefNumbers[nxt->subid] = nxt; - } - } - if(curDef->id==162) //random monster lvl 5 - { - CGDefInfo * nxt = curDef; - nxt->id = 54; - nxt->subid = 14*(rand()%9)+rand()%2+8; - if(creDefNumbers[nxt->subid]!=NULL) - { - CGI->objh->objInstances[j]->defInfo = creDefNumbers[nxt->subid]; - continue; - } - nxt->name = creDefNames[nxt->subid]; - map.defy.push_back(nxt); // add this def to the vector - defsToUnpack.push_back(nxt->name); - CGI->objh->objInstances[j]->defInfo = nxt; - if(creDefNumbers[nxt->subid]==NULL) - { - creDefNumbers[nxt->subid] = nxt; - } - } - if(curDef->id==163) //random monster lvl 6 - { - CGDefInfo* nxt = curDef; - nxt->id = 54; - nxt->subid = 14*(rand()%9)+rand()%2+10; - if(creDefNumbers[nxt->subid]!=NULL) - { - CGI->objh->objInstances[j]->defInfo = creDefNumbers[nxt->subid]; - continue; - } - nxt->name = creDefNames[nxt->subid]; - map.defy.push_back(nxt); // add this def to the vector - defsToUnpack.push_back(nxt->name); - CGI->objh->objInstances[j]->defInfo = nxt; - if(creDefNumbers[nxt->subid]==NULL) - { - creDefNumbers[nxt->subid] = nxt; - } - } - if(curDef->id==164) //random monster lvl 7 - { - CGDefInfo * nxt = curDef; - nxt->id = 54; - nxt->subid = 14*(rand()%9)+rand()%2+12; - if(creDefNumbers[nxt->subid]!=NULL) - { - CGI->objh->objInstances[j]->defInfo = creDefNumbers[nxt->subid]; - continue; - } - nxt->name = creDefNames[nxt->subid]; - map.defy.push_back(nxt); // add this def to the vector - defsToUnpack.push_back(nxt->name); - CGI->objh->objInstances[j]->defInfo = nxt; - if(creDefNumbers[nxt->subid]==NULL) - { - creDefNumbers[nxt->subid] = nxt; - } - } - if(curDef->id==71) //random monster (any level) - { - CGDefInfo * nxt = curDef; - nxt->id = 54; - nxt->subid = rand()%126; - if(creDefNumbers[nxt->subid]!=NULL) - { - CGI->objh->objInstances[j]->defInfo = creDefNumbers[nxt->subid]; - continue; - } - nxt->name = creDefNames[nxt->subid]; - map.defy.push_back(nxt); // add this def to the vector - defsToUnpack.push_back(nxt->name); - CGI->objh->objInstances[j]->defInfo = nxt; - if(creDefNumbers[nxt->subid]==NULL) - { - creDefNumbers[nxt->subid] = nxt; - } - } - break; - } //end of case - case EDefType::ARTIFACT_DEF: - { - if(curDef->id==65) //random atrifact (any class) - { - CGDefInfo *nxt = curDef; - nxt->id = 5; - nxt->subid = rand()%artDefNames.size(); - if(artDefNumbers[nxt->subid]!=NULL) - { - CGI->objh->objInstances[j]->defInfo = artDefNumbers[nxt->subid]; - continue; - } - nxt->name = artDefNames[nxt->subid]; - map.defy.push_back(nxt); // add this def to the vector - defsToUnpack.push_back(nxt->name); - CGI->objh->objInstances[j]->defInfo = nxt; - if(artDefNumbers[nxt->subid]==NULL) - { - artDefNumbers[nxt->subid] = nxt; - } - } - if(curDef->id==66) //random atrifact (treasure) - { - CGDefInfo* nxt = curDef; - nxt->id = 5; - nxt->subid = rand()%art1DefNames.size(); - if(art1DefNumbers[nxt->subid]!=NULL) - { - CGI->objh->objInstances[j]->defInfo = art1DefNumbers[nxt->subid]; - continue; - } - nxt->name = art1DefNames[nxt->subid]; - map.defy.push_back(nxt); // add this def to the vector - defsToUnpack.push_back(nxt->name); - CGI->objh->objInstances[j]->defInfo = nxt; - if(art1DefNumbers[nxt->subid]==NULL) - { - art1DefNumbers[nxt->subid] = nxt; - } - } - if(curDef->id==67) //random atrifact (minor) - { - CGDefInfo *nxt = curDef; - nxt->id = 5; - nxt->subid = rand()%art2DefNames.size(); - if(art2DefNumbers[nxt->subid]!=NULL) - { - CGI->objh->objInstances[j]->defInfo = art2DefNumbers[nxt->subid]; - continue; - } - nxt->name = art2DefNames[nxt->subid]; - map.defy.push_back(nxt); // add this def to the vector - defsToUnpack.push_back(nxt->name); - CGI->objh->objInstances[j]->defInfo = nxt; - if(art2DefNumbers[nxt->subid]==NULL) - { - art2DefNumbers[nxt->subid] = nxt; - } - } - if(curDef->id==68) //random atrifact (major) - { - CGDefInfo* nxt = curDef; - nxt->id = 5; - nxt->subid = rand()%art3DefNames.size(); - if(art3DefNumbers[nxt->subid]!=NULL) - { - CGI->objh->objInstances[j]->defInfo = art3DefNumbers[nxt->subid]; - continue; - } - nxt->name = art3DefNames[nxt->subid]; - map.defy.push_back(nxt); // add this def to the vector - defsToUnpack.push_back(nxt->name); - CGI->objh->objInstances[j]->defInfo = nxt; - if(art3DefNumbers[nxt->subid]==NULL) - { - art3DefNumbers[nxt->subid] =nxt; - } - } - if(curDef->id==69) //random atrifact (relic) - { - CGDefInfo *nxt = curDef; - nxt->id = 5; - nxt->subid = rand()%art4DefNames.size(); - if(art4DefNumbers[nxt->subid]!=NULL) - { - CGI->objh->objInstances[j]->defInfo = art4DefNumbers[nxt->subid]; - continue; - } - nxt->name = art4DefNames[nxt->subid]; - map.defy.push_back(nxt); // add this def to the vector - defsToUnpack.push_back(nxt->name); - CGI->objh->objInstances[j]->defInfo = nxt; - if(art4DefNumbers[nxt->subid]==NULL) - { - art4DefNumbers[nxt->subid] = nxt; - } - } - break; - } - case EDefType::TOWN_DEF: - { - if(curDef->id==77) //random town - { - CGDefInfo* nxt = curDef; - nxt->id = 98; - if(((CCastleObjInfo*)CGI->objh->objInstances[j]->info)->player==0xff) - { - nxt->subid = rand()%town1DefNames.size(); - } - else - { - if(CGI->scenarioOps.getIthPlayersSettings(((CCastleObjInfo*)CGI->objh->objInstances[j]->info)->player).castle>-1) - { - nxt->subid = CGI->scenarioOps.getIthPlayersSettings(((CCastleObjInfo*)CGI->objh->objInstances[j]->info)->player).castle; - } - else - { - nxt->subid = rand()%town1DefNames.size(); - } - } - if(town1DefNumbers[nxt->subid]!=NULL) - { - CGI->objh->objInstances[j]->defInfo = town1DefNumbers[nxt->subid]; - continue; - } - nxt->name = town1DefNames[nxt->subid]; - map.defy.push_back(nxt); // add this def to the vector - defsToUnpack.push_back(nxt->name); - CGI->objh->objInstances[j]->defInfo = nxt; - if(town1DefNumbers[nxt->subid]==NULL) - { - town1DefNumbers[nxt->subid] = nxt; - } - for (int ij=0;ijtownh->townInstances.size();ij++) // wyharatac gdy bedzie dziedziczenie - { - if (CGI->townh->townInstances[ij]->pos==CGI->objh->objInstances[j]->pos) - { - CGI->townh->townInstances[ij]->town = &CGI->townh->towns[nxt->subid]; - break; - } - } - } - //((CCastleObjInfo*)CGI->objh->objInstances[j].info) - break; - } - case EDefType::HERO_DEF: - { - CGI->objh->objInstances[j]->defInfo->printPriority = 0; - break; - } - } //end of main switch - } //end of main loop - for(int j=0; jobjh->objInstances.size(); ++j) //for creature dwellings on map (they are town type dependent) - { - CGDefInfo * curDef = CGI->objh->objInstances[j]->defInfo; - switch(getDefType(curDef)) - { - case EDefType::CREGEN_DEF: - { - if(((CCreGenObjInfo*)CGI->objh->objInstances[j]->info)->asCastle) - { - CGDefInfo *nxt = curDef; - nxt->id = 17; - for(int vv=0; vvobjh->objInstances.size(); ++vv) - { - if(getDefType(CGI->objh->objInstances[vv]->defInfo)==EDefType::TOWN_DEF) - { - if( - ((CCastleObjInfo*)CGI->objh->objInstances[vv]->info)->bytes[0]==((CCreGenObjInfo*)CGI->objh->objInstances[j]->info)->bytes[0] - && ((CCastleObjInfo*)CGI->objh->objInstances[vv]->info)->bytes[1]==((CCreGenObjInfo*)CGI->objh->objInstances[j]->info)->bytes[1] - && ((CCastleObjInfo*)CGI->objh->objInstances[vv]->info)->bytes[2]==((CCreGenObjInfo*)CGI->objh->objInstances[j]->info)->bytes[2] - && ((CCastleObjInfo*)CGI->objh->objInstances[vv]->info)->bytes[3]==((CCreGenObjInfo*)CGI->objh->objInstances[j]->info)->bytes[3]) - { - for(int mm=0; mmobjh->objInstances[vv]->defInfo->name; - std::transform(hlp.begin(), hlp.end(), hlp.begin(), (int(*)(int))toupper); - if(town1DefNames[mm]==hlp) - { - nxt->subid = mm; - } - } - } - } - } - int lvl = atoi(CGI->objh->objInstances[j]->defInfo->name.substr(7, 8).c_str())-1; - nxt->name = creGenNames[nxt->subid][lvl]; - if(creGenNumbers[nxt->subid][lvl]!=NULL) - { - CGI->objh->objInstances[j]->defInfo = creGenNumbers[nxt->subid][lvl]; - continue; - } - map.defy.push_back(nxt); // add this def to the vector - defsToUnpack.push_back(nxt->name); - CGI->objh->objInstances[j]->defInfo = nxt; - if(creGenNumbers[nxt->subid][lvl]==NULL) - { - creGenNumbers[nxt->subid][lvl] = nxt; - } - } - else //if not as castle - { - CGDefInfo * nxt = curDef; - nxt->id = 17; - std::vector possibleTowns; - for(int bb=0; bb<8; ++bb) - { - if(((CCreGenObjInfo*)CGI->objh->objInstances[j]->info)->castles[0] & (1<objh->objInstances[j]->info)->castles[1]) - possibleTowns.push_back(8); - nxt->subid = possibleTowns[rand()%possibleTowns.size()]; - int lvl = atoi(CGI->objh->objInstances[j]->defInfo->name.substr(7, 8).c_str())-1; - nxt->name = creGenNames[nxt->subid][lvl]; - if(creGenNumbers[nxt->subid][lvl]!=NULL) - { - CGI->objh->objInstances[j]->defInfo = creGenNumbers[nxt->subid][lvl]; - continue; - } - map.defy.push_back(nxt); // add this def to the vector - defsToUnpack.push_back(nxt->name); - CGI->objh->objInstances[j]->defInfo = nxt; - if(creGenNumbers[nxt->subid][lvl]==NULL) - { - creGenNumbers[nxt->subid][lvl] = nxt; - } - } - break; - } - case EDefType::CREGEN2_DEF: - { - if(((CCreGenObjInfo*)CGI->objh->objInstances[j]->info)->asCastle) - { - CGDefInfo * nxt = curDef; - nxt->id = 17; - for(int vv=0; vvobjh->objInstances.size(); ++vv) - { - if(getDefType(CGI->objh->objInstances[vv]->defInfo)==EDefType::TOWN_DEF) - { - if( - ((CCastleObjInfo*)CGI->objh->objInstances[vv]->info)->bytes[0]==((CCreGen2ObjInfo*)CGI->objh->objInstances[j]->info)->bytes[0] - && ((CCastleObjInfo*)CGI->objh->objInstances[vv]->info)->bytes[1]==((CCreGen2ObjInfo*)CGI->objh->objInstances[j]->info)->bytes[1] - && ((CCastleObjInfo*)CGI->objh->objInstances[vv]->info)->bytes[2]==((CCreGen2ObjInfo*)CGI->objh->objInstances[j]->info)->bytes[2] - && ((CCastleObjInfo*)CGI->objh->objInstances[vv]->info)->bytes[3]==((CCreGen2ObjInfo*)CGI->objh->objInstances[j]->info)->bytes[3]) - { - for(int mm=0; mmobjh->objInstances[vv]->defInfo->name; - std::transform(hlp.begin(), hlp.end(), hlp.begin(), (int(*)(int))toupper); - if(town1DefNames[mm]==hlp) - { - nxt->subid = mm; - } - } - } - } - } - int lvl; - if((((CCreGen2ObjInfo*)CGI->objh->objInstances[j]->info)->maxLevel - ((CCreGen2ObjInfo*)CGI->objh->objInstances[j]->info)->minLevel)!=0) - lvl = rand()%(((CCreGen2ObjInfo*)CGI->objh->objInstances[j]->info)->maxLevel - ((CCreGen2ObjInfo*)CGI->objh->objInstances[j]->info)->minLevel) + ((CCreGen2ObjInfo*)CGI->objh->objInstances[j]->info)->minLevel; - else lvl = 0; - nxt->name = creGenNames[nxt->subid][lvl]; - if(creGenNumbers[nxt->subid][lvl]!=NULL) - { - CGI->objh->objInstances[j]->defInfo = creGenNumbers[nxt->subid][lvl]; - continue; - } - map.defy.push_back(nxt); // add this def to the vector - defsToUnpack.push_back(nxt->name); - CGI->objh->objInstances[j]->defInfo = nxt; - if(creGenNumbers[nxt->subid][lvl]==NULL) - { - creGenNumbers[nxt->subid][lvl] = nxt; - } - } - else //if not as castle - { - CGDefInfo * nxt = curDef; - nxt->id = 17; - std::vector possibleTowns; - for(int bb=0; bb<8; ++bb) - { - if(((CCreGen2ObjInfo*)CGI->objh->objInstances[j]->info)->castles[0] & (1<objh->objInstances[j]->info)->castles[1]) - possibleTowns.push_back(8); - nxt->subid = possibleTowns[rand()%possibleTowns.size()]; - int lvl = rand()%(((CCreGen2ObjInfo*)CGI->objh->objInstances[j]->info)->maxLevel - ((CCreGen2ObjInfo*)CGI->objh->objInstances[j]->info)->minLevel) + ((CCreGen2ObjInfo*)CGI->objh->objInstances[j]->info)->minLevel; - nxt->name = creGenNames[nxt->subid][lvl]; - if(creGenNumbers[nxt->subid][lvl]!=NULL) - { - CGI->objh->objInstances[j]->defInfo = creGenNumbers[nxt->subid][lvl]; - continue; - } - map.defy.push_back(nxt); // add this def to the vector - defsToUnpack.push_back(nxt->name); - CGI->objh->objInstances[j]->defInfo = nxt; - if(creGenNumbers[nxt->subid][lvl]==NULL) - { - creGenNumbers[nxt->subid][lvl] = nxt; - } - } - } - case EDefType::CREGEN3_DEF: - { - CGDefInfo * nxt = curDef; - nxt->id = 17; - nxt->subid = atoi(CGI->objh->objInstances[j]->defInfo->name.substr(7, 8).c_str()); - int lvl = -1; - CCreGen3ObjInfo * ct = (CCreGen3ObjInfo*)CGI->objh->objInstances[j]->info; - if(ct->maxLevel>7) - ct->maxLevel = 7; - if(ct->minLevel<1) - ct->minLevel = 1; - if((((CCreGen3ObjInfo*)CGI->objh->objInstances[j]->info)->maxLevel - ((CCreGen3ObjInfo*)CGI->objh->objInstances[j]->info)->minLevel)!=0) - lvl = rand()%(((CCreGen3ObjInfo*)CGI->objh->objInstances[j]->info)->maxLevel - ((CCreGen3ObjInfo*)CGI->objh->objInstances[j]->info)->minLevel) + ((CCreGen3ObjInfo*)CGI->objh->objInstances[j]->info)->minLevel; - else - lvl = ((CCreGen3ObjInfo*)CGI->objh->objInstances[j]->info)->maxLevel; - nxt->name = creGenNames[nxt->subid][lvl]; - if(creGenNumbers[nxt->subid][lvl]!=NULL) - { - CGI->objh->objInstances[j]->defInfo = creGenNumbers[nxt->subid][lvl]; - continue; - } - map.defy.push_back(nxt); // add this def to the vector - defsToUnpack.push_back(nxt->name); - CGI->objh->objInstances[j]->defInfo = nxt; - if(creGenNumbers[nxt->subid][lvl]==NULL) - { - creGenNumbers[nxt->subid][lvl] = nxt; - } - break; - } - }//end of main switch - } //end of sencond for loop -} +{} diff --git a/hch/CArtHandler.cpp b/hch/CArtHandler.cpp index 57586ebf2..06b02a19f 100644 --- a/hch/CArtHandler.cpp +++ b/hch/CArtHandler.cpp @@ -143,4 +143,22 @@ void CArtHandler::loadArtifacts() artifacts.push_back(nart); } + for(int i=0;i<144;i++) //do 144, bo nie chcemy bzdurek + { + switch (artifacts[i].aClass) + { + case TartClass: + treasures.push_back(&(artifacts[i])); + break; + case NartClass: + minors.push_back(&(artifacts[i])); + break; + case JartClass: + majors.push_back(&(artifacts[i])); + break; + case RartClass: + relics.push_back(&(artifacts[i])); + break; + } + } } diff --git a/hch/CArtHandler.h b/hch/CArtHandler.h index ebc191ae1..32a5a3646 100644 --- a/hch/CArtHandler.h +++ b/hch/CArtHandler.h @@ -25,6 +25,7 @@ class CArtHandler //handles artifacts { public: CDefHandler * artDefs; + std::vector treasures, minors, majors, relics; std::vector artifacts; void loadArtifacts(); bool loadArtEvents(); diff --git a/hch/CCreatureHandler.cpp b/hch/CCreatureHandler.cpp index a6ff1595e..8dda66eae 100644 --- a/hch/CCreatureHandler.cpp +++ b/hch/CCreatureHandler.cpp @@ -24,15 +24,8 @@ void CCreatureHandler::loadCreatures() while(i190 && buf.substr(i, buf.size()-i).find('\r')==std::string::npos) - //{ - // loadAnimationInfo(); - // loadUnitAnimations(); - // break; - //} - CCreature ncre; - + ncre.level=0; int befi=i; for(i; i >(i,std::vector())); + ifs.open("config/monsters.txt"); + { + while(!ifs.eof()) + { + int id, lvl; + ifs >> id >> lvl; + if(lvl>0) + { + creatures[id].level = lvl; + levelCreatures[lvl].push_back(&(creatures[id])); + } + } + } //loading 32x32px imgs CDefHandler *smi = CGI->spriteh->giveDef("CPRSMALL.DEF"); diff --git a/hch/CCreatureHandler.h b/hch/CCreatureHandler.h index b0a56d1e8..230a2986d 100644 --- a/hch/CCreatureHandler.h +++ b/hch/CCreatureHandler.h @@ -16,6 +16,7 @@ public: std::string namePl, nameSing, nameRef; //name in singular and plural form; and reference name int wood, mercury, ore, sulfur, crystal, gems, gold, fightValue, AIValue, growth, hordeGrowth, hitPoints, speed, attack, defence, shots, spells; int low1, low2, high1, high2; //TODO - co to w ogóle jest??? + int level; // 0 - unknown std::string abilityText; //description of abilities std::string abilityRefs; //references to abilities, in textformat int idNumber; @@ -51,6 +52,7 @@ public: std::map smallImgs; //creature ID -> small 32x32 img of creature; //ID=-2 is for blank (black) img; -1 for the border std::map bigImgs; //creature ID -> big 58x64 img of creature; //ID=-2 is for blank (black) img; -1 for the border std::vector creatures; + std::map > levelCreatures; //level -> list of creatures std::map nameToID; void loadCreatures(); void loadAnimationInfo(); diff --git a/hch/CDefObjInfoHandler.cpp b/hch/CDefObjInfoHandler.cpp index 546fc67a5..af29bafa0 100644 --- a/hch/CDefObjInfoHandler.cpp +++ b/hch/CDefObjInfoHandler.cpp @@ -4,6 +4,15 @@ #include "CLodHandler.h" #include +bool CGDefInfo::isVisitable() +{ + for (int i=0; i<6; i++) + { + if (visitMap[i]) + return true; + } + return false; +} bool DefObjInfo::operator==(const std::string & por) const { return this->defName == por; @@ -11,21 +20,23 @@ bool DefObjInfo::operator==(const std::string & por) const void CDefObjInfoHandler::load() { + nodrze ideki; std::istringstream inp(CGameInfo::mainObj->bitmaph->getTextFile("ZOBJCTS.TXT")); int objNumber; inp>>objNumber; for(int hh=0; hhhandler = NULL; std::string dump; - inp>>nobj.defName; + inp>>nobj->name; - std::transform(nobj.defName.begin(), nobj.defName.end(), nobj.defName.begin(), (int(*)(int))toupper); + std::transform(nobj->name.begin(), nobj->name.end(), nobj->name.begin(), (int(*)(int))toupper); for(int o=0; o<6; ++o) { - nobj.blockMap[o] = 0xff; - nobj.visitMap[o] = 0x00; + nobj->blockMap[o] = 0xff; + nobj->visitMap[o] = 0x00; } std::string mapStr; inp>>mapStr; @@ -34,7 +45,7 @@ void CDefObjInfoHandler::load() { if(mapStr[v]=='0') { - nobj.blockMap[v/8] &= 255 - (128 >> (v%8)); + nobj->blockMap[v/8] &= 255 - (128 >> (v%8)); } } inp>>mapStr; @@ -43,17 +54,19 @@ void CDefObjInfoHandler::load() { if(mapStr[v]=='1') { - nobj.visitMap[v/8] |= (128 >> (v%8)); + nobj->visitMap[v/8] |= (128 >> (v%8)); } } for(int yy=0; yy<2; ++yy) inp>>dump; - inp>>nobj.type; - inp>>nobj.subtype; - inp>>nobj.objType; - inp>>nobj.priority; - objs.push_back(nobj); + inp>>nobj->id; + inp>>nobj->subid; + inp>>nobj->type; + inp>>nobj->printPriority; + gobjs[nobj->id][nobj->subid] = nobj; + if(nobj->id==98) + castles[nobj->subid]=nobj; } } diff --git a/hch/CDefObjInfoHandler.h b/hch/CDefObjInfoHandler.h index bd44547bd..fef592b6e 100644 --- a/hch/CDefObjInfoHandler.h +++ b/hch/CDefObjInfoHandler.h @@ -1,8 +1,30 @@ #ifndef COBJINFOECTHANDLER_H #define COBJINFOECTHANDLER_H - #include +#include +class CDefHandler; +class CGDefInfo +{ +public: + std::string name; + unsigned char visitMap[6]; + unsigned char blockMap[6]; + int id, subid; //of object described by this defInfo + int terrainAllowed, //on which terrain it is possible to place object + terrainMenu; //in which menus in map editor object will be showed + int type; //(0- ground, 1- towns, 2-creatures, 3- heroes, 4-artifacts, 5- resources) + CDefHandler * handler; + int printPriority; + bool isVisitable(); + bool operator<(const CGDefInfo& por) + { + if(id!=por.id) + return id > gobjs; - std::vector objs; + std::map > gobjs; + std::map castles; + //std::vector objs; void load(); }; diff --git a/hch/CObjectHandler.cpp b/hch/CObjectHandler.cpp index beadd0e5c..671cb603e 100644 --- a/hch/CObjectHandler.cpp +++ b/hch/CObjectHandler.cpp @@ -69,7 +69,16 @@ void CObjectHandler::loadObjects() restypes.push_back(temp); } - + cregens.resize(110); //TODO: hardcoded value - change + for(int i=0; i> dw >> cr; + cregens[dw]=cr; + } } @@ -131,15 +140,6 @@ bool CGObjectInstance::operator<(const CGObjectInstance & cmp) const //screen p return false; } -bool CGDefInfo::isVisitable() -{ - for (int i=0; i<6; i++) - { - if (visitMap[i]) - return true; - } - return false; -} bool CGHeroInstance::isHero() const { @@ -228,6 +228,10 @@ bool CGTownInstance::hasFort() const { return (builtBuildings.find(7))!=builtBuildings.end(); } +bool CGTownInstance::hasCapitol() const +{ + return (builtBuildings.find(13))!=builtBuildings.end(); +} CGTownInstance::CGTownInstance() { pos = int3(-1,-1,-1); diff --git a/hch/CObjectHandler.h b/hch/CObjectHandler.h index e1457968f..3c2f88919 100644 --- a/hch/CObjectHandler.h +++ b/hch/CObjectHandler.h @@ -242,7 +242,7 @@ class CCreGenObjInfo : public CSpecObjInfo public: unsigned char player; //owner bool asCastle; - unsigned char bytes[4]; //castle identifier + int identifier; unsigned char castles[2]; //allowed castles }; @@ -251,7 +251,7 @@ class CCreGen2ObjInfo : public CSpecObjInfo public: unsigned char player; //owner bool asCastle; - unsigned char bytes[4]; //castle identifier + int identifier; unsigned char castles[2]; //allowed castles unsigned char minLevel, maxLevel; //minimal and maximal level of creature in dwelling: <0, 6> }; @@ -298,44 +298,7 @@ public: std::string name; //object's name }; -class CGDefInfo -{ -public: - std::string name; - - unsigned char visitMap[6]; - unsigned char blockMap[6]; - int id, subid; //of object described by this defInfo - int terrainAllowed, //on which terrain it is possible to place object - terrainMenu; //in which menus in map editor object will be showed - int type; //(0- ground, 1- towns, 2-creatures, 3- heroes, 4-artifacts, 5- resources) - CDefHandler * handler; - int printPriority; - bool isVisitable(); -}; - -//class CObjectType -//{ -//public: -// CGObjectInstance * ourObj; -// int type; -// int owner; //254 - can't be flagged; 255 - neutral -////}; -//class IVisitable -//{ -// virtual void newObject(CGObjectInstance *os); -// virtual void onHeroVisit(CGObjectInstance *os, int heroID); -// virtual void getRightText(tribool visited); -// virtual void getHoverText(tribool visited); -//}; -// -//class CVisitableOPH //object visitable once per hero -//{ -// virtual void newObject(CGObjectInstance *os); -// virtual void onHeroVisit(CGObjectInstance *os, int heroID); -// virtual void getRightText(tribool visited); -// virtual void getHoverText(tribool visited); -//}; +class CGDefInfo; class CGObjectInstance { @@ -415,6 +378,7 @@ public: CCreatureSet garrison; int builded; //how many buildings has been built this turn int destroyed; //how many buildings has been destroyed this turn + int identifier; int income; @@ -429,6 +393,7 @@ public: int getSightDistance() const; //returns sight distance bool hasFort() const; + bool hasCapitol() const; int dailyIncome() const; CGTownInstance(); @@ -440,6 +405,7 @@ class CObjectHandler public: std::vector objects; //vector of objects; i-th object in vector has subnumber i std::vector objInstances; //vector with objects on map + std::vector cregens; //type 17. dwelling subid -> creature ID void loadObjects(); std::vector advobtxt; diff --git a/hch/CTownHandler.cpp b/hch/CTownHandler.cpp index c272275e8..9151b74dd 100644 --- a/hch/CTownHandler.cpp +++ b/hch/CTownHandler.cpp @@ -199,6 +199,20 @@ void CTownHandler::loadNames() } of.close(); of.clear(); + + for(int x=0;x> tid >> lid >> cid; + if(lid < towns[tid].basicCreatures.size()) + towns[tid].basicCreatures[lid]=cid; + } + of.close(); + of.clear(); } } SDL_Surface * CTownHandler::getPic(int ID, bool fort, bool builded) diff --git a/hch/CTownHandler.h b/hch/CTownHandler.h index f6c38d096..13fea7094 100644 --- a/hch/CTownHandler.h +++ b/hch/CTownHandler.h @@ -17,6 +17,7 @@ class CTown public: std::string name; //name of type std::vector names; //names of the town instances + std::vector basicCreatures; //level (from 0) -> ID int bonus; //pic number int typeID; }; diff --git a/mapHandler.cpp b/mapHandler.cpp index 7ea6ad06f..b9b63e317 100644 --- a/mapHandler.cpp +++ b/mapHandler.cpp @@ -25,78 +25,199 @@ public: return (*a.first)<(*b.first); } } ocmptwo ; - -void CMapHandler::randomizeObjects() -{ - for(int gh=0; gh<2; ++gh) //some objects can be initialized not before initializing some other +void alphaTransformDef(CGDefInfo * defInfo) +{ + SDL_Surface * alphaTransSurf = SDL_CreateRGBSurface(SDL_SWSURFACE, 12, 12, 32, 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000); + for(int yy=0;yyhandler->ourImages.size();yy++) { - for(int no=0; noobjh->objInstances.size(); ++no) + defInfo->handler->ourImages[yy].bitmap = CSDL_Ext::alphaTransform(defInfo->handler->ourImages[yy].bitmap); + SDL_Surface * bufs = CSDL_Ext::secondAlphaTransform(defInfo->handler->ourImages[yy].bitmap, alphaTransSurf); + SDL_FreeSurface(defInfo->handler->ourImages[yy].bitmap); + defInfo->handler->ourImages[yy].bitmap = bufs; + defInfo->handler->alphaTransformed = true; + } + SDL_FreeSurface(alphaTransSurf); +} +std::pair CMapHandler::pickObject(CGObjectInstance *obj) +{ + switch(obj->ID) + { + case 65: //random artifact + return std::pair(5,(rand()%136)+7); //tylko sensowny zakres - na poczatku sa katapulty itp, na koncu specjalne i blanki + case 66: //random treasure artifact + return std::pair(5,CGI->arth->treasures[rand()%CGI->arth->treasures.size()]->id); + case 67: //random minor artifact + return std::pair(5,CGI->arth->minors[rand()%CGI->arth->minors.size()]->id); + case 68: //random major artifact + return std::pair(5,CGI->arth->majors[rand()%CGI->arth->majors.size()]->id); + case 69: //random relic artifact + return std::pair(5,CGI->arth->relics[rand()%CGI->arth->relics.size()]->id); + case 70: //random hero + return std::pair(34,rand()%CGI->heroh->heroes.size()); + case 71: //random monster + return std::pair(54,rand()%(CGI->creh->creatures.size())); + case 72: //random monster lvl1 + return std::pair(54,CGI->creh->levelCreatures[1][rand()%CGI->creh->levelCreatures[1].size()]->idNumber); + case 73: //random monster lvl2 + return std::pair(54,CGI->creh->levelCreatures[2][rand()%CGI->creh->levelCreatures[2].size()]->idNumber); + case 74: //random monster lvl3 + return std::pair(54,CGI->creh->levelCreatures[3][rand()%CGI->creh->levelCreatures[3].size()]->idNumber); + case 75: //random monster lvl4 + return std::pair(54,CGI->creh->levelCreatures[4][rand()%CGI->creh->levelCreatures[4].size()]->idNumber); + case 76: //random resource + return std::pair(79,rand()%7); //now it's OH3 style, use %8 for mithril + case 77: //random town + return std::pair(98,rand()%CGI->townh->towns.size()); + case 162: //random monster lvl5 + return std::pair(54,CGI->creh->levelCreatures[5][rand()%CGI->creh->levelCreatures[5].size()]->idNumber); + case 163: //random monster lvl6 + return std::pair(54,CGI->creh->levelCreatures[6][rand()%CGI->creh->levelCreatures[6].size()]->idNumber); + case 164: //random monster lvl7 + return std::pair(54,CGI->creh->levelCreatures[7][rand()%CGI->creh->levelCreatures[7].size()]->idNumber); + case 216: //random dwelling { - std::string nname = getRandomizedDefName(CGI->objh->objInstances[no]->defInfo, CGI->objh->objInstances[no]); - if(nname.size()>0) //change def + int faction = rand()%F_NUMBER; + CCreGen2ObjInfo* info =(CCreGen2ObjInfo*)obj->info; + if (info->asCastle) { - CGDefInfo * ndi = new CGDefInfo; - *ndi = *CGI->objh->objInstances[no]->defInfo; //something to start with - CGI->mh->reader->map.defy.push_back(ndi); - CGI->objh->objInstances[no]->defInfo = ndi; - - int f=-1; - for(f=0; fdobjinfo->objs.size(); ++f) + for(int i=0;iobjh->objInstances.size();i++) { - if(CGI->dobjinfo->objs[f].defName==nname) + if(CGI->objh->objInstances[i]->ID==77 && dynamic_cast(CGI->objh->objInstances[i])->identifier == info->identifier) { + randomizeObject(CGI->objh->objInstances[i]); //we have to randomize the castle first + faction = CGI->objh->objInstances[i]->subID; + break; + } + else if(CGI->objh->objInstances[i]->ID==98 && dynamic_cast(CGI->objh->objInstances[i])->identifier == info->identifier) + { + faction = CGI->objh->objInstances[i]->subID; break; } } - CGI->objh->objInstances[no]->defInfo->name = nname; - if(CGI->objh->objInstances[no]->ID==70) //random hero - init here + } + else + { + while((!(info->castles[0]&(1<objh->objInstances[no]->info); - curc->type = CGI->heroh->heroes[rand()%CGI->heroh->heroes.size()]; - - //making def appropriate for hero type - std::stringstream nm; - nm<<"AH"; - nm<type->heroType; //HARDCODED VALUE! TODO: REMOVE IN FUTURE - nm<<"_.DEF"; - nname = nm.str(); - - curc->sex = rand()%2; //TODO: what to do with that? - curc->name = curc->type->name; - curc->attack = curc->type->heroClass->initialAttack; - curc->defence = curc->type->heroClass->initialDefence; - curc->knowledge = curc->type->heroClass->initialKnowledge; - curc->power = curc->type->heroClass->initialPower; - } - if(loadedDefs.find(nname)!=loadedDefs.end()) - { - CGI->objh->objInstances[no]->defInfo->handler = loadedDefs.find(nname)->second; - } - else - { - CGI->objh->objInstances[no]->defInfo->handler = CGI->spriteh->giveDef(nname); - for(int dd=0; ddobjh->objInstances[no]->defInfo->handler->ourImages.size(); ++dd) - { - CSDL_Ext::fullAlphaTransform(CGI->objh->objInstances[no]->defInfo->handler->ourImages[dd].bitmap); - } - loadedDefs.insert(std::pair(nname, CGI->objh->objInstances[no]->defInfo->handler)); - } - if(f!=-1 && f!=CGI->dobjinfo->objs.size()) - { - CGI->objh->objInstances[no]->ID = CGI->dobjinfo->objs[f].type; - CGI->objh->objInstances[no]->subID = CGI->dobjinfo->objs[f].subtype; - CGI->objh->objInstances[no]->defInfo->id = CGI->dobjinfo->objs[f].type; - CGI->objh->objInstances[no]->defInfo->subid = CGI->dobjinfo->objs[f].subtype; - CGI->objh->objInstances[no]->defInfo->printPriority = CGI->dobjinfo->objs[f].priority; - } - else - { - CGI->objh->objInstances[no]->defInfo->printPriority = 0; + if((faction>7) && (info->castles[1]&(1<<(faction-8)))) + break; + faction = rand()%F_NUMBER; } } + int level = ((info->maxLevel-info->minLevel) ? (rand()%(info->maxLevel-info->minLevel)+info->minLevel) : (info->minLevel)); + int cid = CGI->townh->towns[faction].basicCreatures[level]; + for(int i=0;iobjh->cregens.size();i++) + if(CGI->objh->cregens[i]==cid) + return std::pair(17,i); + std::cout << "Cannot find a dwelling for creature "<(17,0); } + case 217: + { + int faction = rand()%F_NUMBER; + CCreGenObjInfo* info =(CCreGenObjInfo*)obj->info; + if (info->asCastle) + { + for(int i=0;iobjh->objInstances.size();i++) + { + if(CGI->objh->objInstances[i]->ID==77 && dynamic_cast(CGI->objh->objInstances[i])->identifier == info->identifier) + { + randomizeObject(CGI->objh->objInstances[i]); //we have to randomize the castle first + faction = CGI->objh->objInstances[i]->subID; + break; + } + else if(CGI->objh->objInstances[i]->ID==98 && dynamic_cast(CGI->objh->objInstances[i])->identifier == info->identifier) + { + faction = CGI->objh->objInstances[i]->subID; + break; + } + } + } + else + { + while((!(info->castles[0]&(1<7) && (info->castles[1]&(1<<(faction-8)))) + break; + faction = rand()%F_NUMBER; + } + } + int cid = CGI->townh->towns[faction].basicCreatures[obj->subID]; + for(int i=0;iobjh->cregens.size();i++) + if(CGI->objh->cregens[i]==cid) + return std::pair(17,i); + std::cout << "Cannot find a dwelling for creature "<(17,0); + } + case 218: + { + CCreGen3ObjInfo* info =(CCreGen3ObjInfo*)obj->info; + int level = ((info->maxLevel-info->minLevel) ? (rand()%(info->maxLevel-info->minLevel)+info->minLevel) : (info->minLevel)); + int cid = CGI->townh->towns[obj->subID].basicCreatures[level]; + for(int i=0;iobjh->cregens.size();i++) + if(CGI->objh->cregens[i]==cid) + return std::pair(17,i); + std::cout << "Cannot find a dwelling for creature "<(17,0); + } + } + return std::pair(-1,-1); +} +void CMapHandler::randomizeObject(CGObjectInstance *cur) +{ + std::pair ran = pickObject(cur); + if(ran.first<0 || ran.second<0) //this is not a random object, or we couldn't find anything + return; + else if(ran.first==34)//special code for hero + { + CGHeroInstance *h = dynamic_cast(cur); + if(!h) {std::cout<<"Wrong random hero at "<pos<ID = ran.first; + cur->subID = ran.second; + h->type = CGI->heroh->heroes[ran.second]; + CGI->heroh->heroInstances.push_back(h); + CGI->objh->objInstances.erase(std::find(CGI->objh->objInstances.begin(),CGI->objh->objInstances.end(),h)); + return; //TODO: maybe we should do something with definfo? + } + else if(ran.first==98)//special code for town + { + CGTownInstance *t = dynamic_cast(cur); + if(!t) {std::cout<<"Wrong random town at "<pos<ID = ran.first; + cur->subID = ran.second; + t->town = &CGI->townh->towns[ran.second]; + if(t->hasCapitol()) + t->defInfo = capitols[t->subID]; + else if(t->hasFort()) + t->defInfo = CGI->dobjinfo->castles[t->subID]; + else + t->defInfo = villages[t->subID]; + if(!t->defInfo->handler) + { + t->defInfo->handler = CGI->spriteh->giveDef(t->defInfo->name); + alphaTransformDef(t->defInfo); + } + CGI->townh->townInstances.push_back(t); + return; + } + //we have to replace normal random object + cur->ID = ran.first; + cur->subID = ran.second; + cur->defInfo = CGI->dobjinfo->gobjs[ran.first][ran.second]; + if(!cur->defInfo){std::cout<<"Missing def declaration for "<ID<<" "<subID<defInfo->handler) //if we have to load def + { + cur->defInfo->handler = CGI->spriteh->giveDef(cur->defInfo->name); + alphaTransformDef(cur->defInfo); + } + +} +void CMapHandler::randomizeObjects() +{ + CGObjectInstance * cur; + for(int no=0; noobjh->objInstances.size(); ++no) + { + randomizeObject(CGI->objh->objInstances[no]); } } void CMapHandler::prepareFOWDefs() @@ -502,6 +623,10 @@ void CMapHandler::initObjectRects() { /*CGI->objh->objInstances[f]->pos.x+=1; CGI->objh->objInstances[f]->pos.y+=1;*/ + if(!CGI->objh->objInstances[f]->defInfo) + { + continue; + } CDefHandler * curd = CGI->objh->objInstances[f]->defInfo->handler; for(int fx=0; fxourImages[0].bitmap->w/32; ++fx) { @@ -569,6 +694,8 @@ void CMapHandler::calculateBlockedPos() { for(int f=0; fobjh->objInstances.size(); ++f) //calculationg blocked / visitable positions { + if(!CGI->objh->objInstances[f]->defInfo) + continue; CDefHandler * curd = CGI->objh->objInstances[f]->defInfo->handler; for(int fx=0; fx<8; ++fx) { @@ -591,6 +718,22 @@ void CMapHandler::calculateBlockedPos() } void CMapHandler::init() { + std::ifstream ifs("config/townsDefs.txt"); + int ccc; + ifs>>ccc; + for(int i=0;idobjinfo->castles[i%ccc]); + ifs >> n->name; + if (!(n->handler = CGI->spriteh->giveDef(n->name))) + std::cout << "Cannot open "<name<map.defy.size(); ++h) //initializing loaded def handler's info { - std::string hlp = reader->map.defy[h]->name; - std::transform(hlp.begin(), hlp.end(), hlp.begin(), (int(*)(int))toupper); - CGI->mh->loadedDefs.insert(std::make_pair(hlp, reader->map.defy[h]->handler)); + //std::string hlp = reader->map.defy[h]->name; + //std::transform(hlp.begin(), hlp.end(), hlp.begin(), (int(*)(int))toupper); + CGI->mh->loadedDefs.insert(std::make_pair(reader->map.defy[h]->name, reader->map.defy[h]->handler)); } std::cout<<"\tCollecting loaded def's handlers: "<ourImages[0].bitmap; //this case should never happen, but it is better to hide too much than reveal it.... } -//char & CMapHandler::visAccess(int x, int y) -//{ -// return visibility[x+Woff][y+Hoff]; -//} -// -//char & CMapHandler::undVisAccess(int x, int y) -//{ -// return undVisibility[x+Woff][y+Hoff]; -//} - int CMapHandler::getCost(int3 &a, int3 &b, const CGHeroInstance *hero) { int ret=-1; @@ -1470,7 +1603,7 @@ std::vector < std::string > CMapHandler::getObjDescriptions(int3 pos) if (objs[g].first->state) ret.push_back(objs[g].first->state->hoverText(objs[g].first)); else - ret.push_back(CGI->objh->objects[objs[g].first->defInfo->id].name); + ret.push_back(CGI->objh->objects[objs[g].first->ID].name); } } return ret; @@ -1505,7 +1638,10 @@ CGObjectInstance * CMapHandler::createObject(int id, int subid, int3 pos) } nobj->ID = id; nobj->subID = subid; - nobj->defInfo = new CGDefInfo; + nobj->defInfo = CGI->dobjinfo->gobjs[id][subid]; + if(!nobj->defInfo) + std::cout <<"No def declaration for " <dobjinfo->objs.size(); ++f) { @@ -1519,8 +1655,8 @@ CGObjectInstance * CMapHandler::createObject(int id, int subid, int3 pos) for(int g=0; g<6; ++g) nobj->defInfo->blockMap[g] = CGI->dobjinfo->objs[defObjInfoNumber].blockMap[g]; for(int g=0; g<6; ++g) - nobj->defInfo->visitMap[g] = CGI->dobjinfo->objs[defObjInfoNumber].visitMap[g]; - nobj->defInfo->printPriority = CGI->dobjinfo->objs[defObjInfoNumber].priority; + nobj->defInfo->visitMap[g] = CGI->dobjinfo->objs[nobj->defObjInfoNumber].visitMap[g]; + nobj->defInfo->printPriority = CGI->dobjinfo->objs[nobj->defObjInfoNumber].priority;*/ nobj->pos = pos; //nobj->state = NULL;//new CLuaObjectScript(); nobj->tempOwner = 254; @@ -1549,11 +1685,9 @@ CGObjectInstance * CMapHandler::createObject(int id, int subid, int3 pos) std::string CMapHandler::getDefName(int id, int subid) { - for(int i=0; idobjinfo->objs.size(); ++i) - { - if(CGI->dobjinfo->objs[i].type==id && CGI->dobjinfo->objs[i].subtype==subid) - return CGI->dobjinfo->objs[i].defName; - } + CGDefInfo* temp = CGI->dobjinfo->gobjs[id][subid]; + if(temp) + return temp->name; throw new std::exception("Def not found."); } @@ -1571,7 +1705,7 @@ bool CMapHandler::printObject(CGObjectInstance *obj) cr.y = fy*32; std::pair>>> toAdd = std::make_pair(obj, std::make_pair(cr, std::vector>())); ///initializing places that will be coloured by blitting (flag colour / player colour positions) - if(toAdd.first->defInfo->isVisitable()) + if(CGI->dobjinfo->gobjs[toAdd.first->ID][toAdd.first->subID]->isVisitable()) { toAdd.second.second.resize(toAdd.first->defInfo->handler->ourImages.size()); for(int no = 0; nodefInfo->handler->ourImages.size(); ++no) @@ -1637,342 +1771,6 @@ bool CMapHandler::hideObject(CGObjectInstance *obj) std::string CMapHandler::getRandomizedDefName(CGDefInfo *di, CGObjectInstance * obj) { - if(di->id==76) //random resource - { - std::vector resDefNames; - //resDefNames.push_back("AVTRNDM0.DEF"); - resDefNames.push_back("AVTWOOD0.DEF"); - resDefNames.push_back("AVTMERC0.DEF"); - resDefNames.push_back("AVTORE0.DEF"); - resDefNames.push_back("AVTSULF0.DEF"); - resDefNames.push_back("AVTCRYS0.DEF"); - resDefNames.push_back("AVTGEMS0.DEF"); - resDefNames.push_back("AVTGOLD0.DEF"); - resDefNames.push_back("ZMITHR.DEF"); - return resDefNames[rand()%resDefNames.size()]; - } - else if(di->id==72 || di->id==73 || di->id==74 || di->id==75 || di->id==162 || di->id==163 || di->id==164 || di->id==71) //random monster - { - std::vector creDefNames; - for(int dd=0; dd<140; ++dd) //we do not use here WoG units - { - creDefNames.push_back(CGI->dobjinfo->objs[dd+1184].defName); - } - - switch(di->id) - { - case 72: //level 1 - return creDefNames[14*(rand()%9)+rand()%2]; - case 73: //level 2 - return creDefNames[14*(rand()%9)+rand()%2+2]; - case 74: //level 3 - return creDefNames[14*(rand()%9)+rand()%2+4]; - case 75: //level 4 - return creDefNames[14*(rand()%9)+rand()%2+6]; - case 162: //level 5 - return creDefNames[14*(rand()%9)+rand()%2+8]; - case 163: //level 6 - return creDefNames[14*(rand()%9)+rand()%2+10]; - case 164: //level 7 - return creDefNames[14*(rand()%9)+rand()%2+12]; - case 71: // any level - return creDefNames[rand()%126]; - } - } - else if(di->id==65) //random artifact (any class) - { - std::vector artDefNames; - for(int bb=0; bb<162; ++bb) - { - if(CGI->arth->artifacts[CGI->dobjinfo->objs[bb+213].subtype].aClass!=EartClass::SartClass) - artDefNames.push_back(CGI->dobjinfo->objs[bb+213].defName); - } - return artDefNames[rand()%artDefNames.size()]; - } - else if(di->id==66) //random artifact (treasure) - { - std::vector art1DefNames; - for(int bb=0; bb<162; ++bb) - { - if(CGI->arth->artifacts[CGI->dobjinfo->objs[bb+213].subtype].aClass==EartClass::TartClass) - art1DefNames.push_back(CGI->dobjinfo->objs[bb+213].defName); - } - return art1DefNames[rand()%art1DefNames.size()]; - } - else if(di->id==67) //random artifact (minor) - { - std::vector art2DefNames; - for(int bb=0; bb<162; ++bb) - { - if(CGI->arth->artifacts[CGI->dobjinfo->objs[bb+213].subtype].aClass==EartClass::NartClass) - art2DefNames.push_back(CGI->dobjinfo->objs[bb+213].defName); - } - return art2DefNames[rand()%art2DefNames.size()]; - } - else if(di->id==68) //random artifact (major) - { - std::vector art3DefNames; - for(int bb=0; bb<162; ++bb) - { - if(CGI->arth->artifacts[CGI->dobjinfo->objs[bb+213].subtype].aClass==EartClass::JartClass) - art3DefNames.push_back(CGI->dobjinfo->objs[bb+213].defName); - } - return art3DefNames[rand()%art3DefNames.size()]; - } - else if(di->id==69) //random artifact (relic) - { - std::vector art4DefNames; - for(int bb=0; bb<162; ++bb) - { - if(CGI->arth->artifacts[CGI->dobjinfo->objs[bb+213].subtype].aClass==EartClass::RartClass) - art4DefNames.push_back(CGI->dobjinfo->objs[bb+213].defName); - } - return art4DefNames[rand()%art4DefNames.size()]; - } - else if(di->id==77) //random town - { - if(!obj) - return std::string(); //obj is necessary! - std::vector town0DefNames; //without fort - town0DefNames.push_back("AVCCAST0.DEF"); - town0DefNames.push_back("AVCRAMP0.DEF"); - town0DefNames.push_back("AVCTOWR0.DEF"); - town0DefNames.push_back("AVCINFT0.DEF"); - town0DefNames.push_back("AVCNECR0.DEF"); - town0DefNames.push_back("AVCDUNG0.DEF"); - town0DefNames.push_back("AVCSTRO0.DEF"); - town0DefNames.push_back("AVCFTRT0.DEF"); - town0DefNames.push_back("AVCHFOR0.DEF"); - - std::vector town1DefNames; //with fort - for(int dd=0; dddobjinfo->objs[dd+384].defName); - } - - std::vector town2DefNames; //with capitol - for(int dd=0; dddobjinfo->objs[dd+384].defName); - } - for(int b=0; btempOwner==0xff) //no preselected preferentions - { - if(((CCastleObjInfo*)obj->info)->hasFort) - return town1DefNames[rand()%town1DefNames.size()]; - else - return town0DefNames[rand()%town0DefNames.size()]; - } - else - { - - if(CGI->scenarioOps.getIthPlayersSettings(((CCastleObjInfo*)obj->info)->player).castle>-1) //castle specified in start options - { - int defnr = CGI->scenarioOps.getIthPlayersSettings(((CCastleObjInfo*)obj->info)->player).castle; - if(((CCastleObjInfo*)obj->info)->hasFort) - return town1DefNames[defnr]; - else - return town0DefNames[defnr]; - } - else //no castle specified - { - int defnr = rand()%F_NUMBER; - if(((CCastleObjInfo*)obj->info)->hasFort) - return town1DefNames[defnr]; - else - return town0DefNames[defnr]; - } - } - } - else if(di->id==70) //random hero - { - std::stringstream nm; - nm<<"AH"; - nm<id==217) //random dwelling with preset level - { - std::vector< std::vector > creGenNames; - creGenNames.resize(F_NUMBER); - - for(int ff=0; ffdobjinfo->objs[394+7*ff+dd].defName); - } - } - - creGenNames[F_NUMBER-1].push_back(CGI->dobjinfo->objs[456].defName); - creGenNames[F_NUMBER-1].push_back(CGI->dobjinfo->objs[451].defName); - creGenNames[F_NUMBER-1].push_back(CGI->dobjinfo->objs[454].defName); - creGenNames[F_NUMBER-1].push_back(CGI->dobjinfo->objs[453].defName); - creGenNames[F_NUMBER-1].push_back(CGI->dobjinfo->objs[452].defName); - creGenNames[F_NUMBER-1].push_back(CGI->dobjinfo->objs[457].defName); - creGenNames[F_NUMBER-1].push_back(CGI->dobjinfo->objs[458].defName); - - if(((CCreGenObjInfo*)obj->info)->asCastle) - { - int fraction = -1; - for(int vv=0; vvobjh->objInstances.size(); ++vv) - { - if(CGI->objh->objInstances[vv]->defInfo->id==98) //is a town - { - if( //check if it is this one we want - ((CCastleObjInfo*)CGI->objh->objInstances[vv]->info)->bytes[0]==((CCreGenObjInfo*)obj->info)->bytes[0] - && ((CCastleObjInfo*)CGI->objh->objInstances[vv]->info)->bytes[1]==((CCreGenObjInfo*)obj->info)->bytes[1] - && ((CCastleObjInfo*)CGI->objh->objInstances[vv]->info)->bytes[2]==((CCreGenObjInfo*)obj->info)->bytes[2] - && ((CCastleObjInfo*)CGI->objh->objInstances[vv]->info)->bytes[3]==((CCreGenObjInfo*)obj->info)->bytes[3]) - { - fraction = CGI->objh->objInstances[vv]->subID; //TODO: is typeID what we really want? - } - } - } - if(fraction == -1) - { - fraction = rand()%F_NUMBER; //TODO: check it more - } - int lvl = atoi(di->name.substr(7, 8).c_str()) - 1; - return creGenNames[fraction][lvl]; - } - else - { - std::vector possibleTowns; - for(int bb=0; bb<8; ++bb) - { - if(((CCreGenObjInfo*)obj->info)->castles[0] & (1<info)->castles[1]) - possibleTowns.push_back(8); - - int fraction = possibleTowns[rand()%possibleTowns.size()]; - int lvl = atoi(di->name.substr(7, 8).c_str()) - 1; - return creGenNames[fraction][lvl]; - } - } - else if(di->id==216) //random dwelling - { - std::vector< std::vector > creGenNames; - creGenNames.resize(F_NUMBER); - - for(int ff=0; ffdobjinfo->objs[394+7*ff+dd].defName); - } - } - - creGenNames[F_NUMBER-1].push_back(CGI->dobjinfo->objs[456].defName); - creGenNames[F_NUMBER-1].push_back(CGI->dobjinfo->objs[451].defName); - creGenNames[F_NUMBER-1].push_back(CGI->dobjinfo->objs[454].defName); - creGenNames[F_NUMBER-1].push_back(CGI->dobjinfo->objs[453].defName); - creGenNames[F_NUMBER-1].push_back(CGI->dobjinfo->objs[452].defName); - creGenNames[F_NUMBER-1].push_back(CGI->dobjinfo->objs[457].defName); - creGenNames[F_NUMBER-1].push_back(CGI->dobjinfo->objs[458].defName); - - if(((CCreGenObjInfo*)obj->info)->asCastle) - { - int faction = -1; - for(int vv=0; vvobjh->objInstances.size(); ++vv) - { - if(CGI->objh->objInstances[vv]->defInfo->id==98) //is a town - { - if( //check if it is this one we want - ((CCastleObjInfo*)CGI->objh->objInstances[vv]->info)->bytes[0]==((CCreGenObjInfo*)obj->info)->bytes[0] - && ((CCastleObjInfo*)CGI->objh->objInstances[vv]->info)->bytes[1]==((CCreGenObjInfo*)obj->info)->bytes[1] - && ((CCastleObjInfo*)CGI->objh->objInstances[vv]->info)->bytes[2]==((CCreGenObjInfo*)obj->info)->bytes[2] - && ((CCastleObjInfo*)CGI->objh->objInstances[vv]->info)->bytes[3]==((CCreGenObjInfo*)obj->info)->bytes[3]) - { - faction = CGI->objh->objInstances[vv]->subID; //TODO: is typeID what we really want? - } - } - } - int lvl=-1; - if((((CCreGen2ObjInfo*)obj->info)->maxLevel - ((CCreGen2ObjInfo*)obj->info)->minLevel)!=0) - lvl = rand()%(((CCreGen2ObjInfo*)obj->info)->maxLevel - ((CCreGen2ObjInfo*)obj->info)->minLevel) + ((CCreGen2ObjInfo*)obj->info)->minLevel; - else lvl = 0; - - return creGenNames[faction][lvl]; - } - else - { - std::vector possibleTowns; - for(int bb=0; bb<8; ++bb) - { - if(((CCreGenObjInfo*)obj->info)->castles[0] & (1<info)->castles[1]) - possibleTowns.push_back(8); - - int faction = possibleTowns[rand()%possibleTowns.size()]; - int lvl=-1; - if((((CCreGen2ObjInfo*)obj->info)->maxLevel - ((CCreGen2ObjInfo*)obj->info)->minLevel)!=0) - lvl = rand()%(((CCreGen2ObjInfo*)obj->info)->maxLevel - ((CCreGen2ObjInfo*)obj->info)->minLevel) + ((CCreGen2ObjInfo*)obj->info)->minLevel; - else lvl = 0; - - return creGenNames[faction][lvl]; - } - } - else if(di->id==218) //random creature generators with preset alignment - { - std::vector< std::vector > creGenNames; - creGenNames.resize(F_NUMBER); - - for(int ff=0; ffdobjinfo->objs[394+7*ff+dd].defName); - } - } - - creGenNames[F_NUMBER-1].push_back(CGI->dobjinfo->objs[456].defName); - creGenNames[F_NUMBER-1].push_back(CGI->dobjinfo->objs[451].defName); - creGenNames[F_NUMBER-1].push_back(CGI->dobjinfo->objs[454].defName); - creGenNames[F_NUMBER-1].push_back(CGI->dobjinfo->objs[453].defName); - creGenNames[F_NUMBER-1].push_back(CGI->dobjinfo->objs[452].defName); - creGenNames[F_NUMBER-1].push_back(CGI->dobjinfo->objs[457].defName); - creGenNames[F_NUMBER-1].push_back(CGI->dobjinfo->objs[458].defName); - - int faction = atoi(di->name.substr(7, 8).c_str()); - - int lvl = -1; - CCreGen3ObjInfo * ct = (CCreGen3ObjInfo*)obj->info; - if(ct->maxLevel>7) - ct->maxLevel = 7; - if(ct->minLevel<1) - ct->minLevel = 1; - if((ct->maxLevel - ct->minLevel)!=0) - lvl = rand()%(ct->maxLevel - ct->minLevel) + ct->minLevel; - else - lvl = ct->maxLevel; - - return creGenNames[faction][lvl]; - } - return std::string(); } diff --git a/mapHandler.h b/mapHandler.h index 14a245839..a361fc0e9 100644 --- a/mapHandler.h +++ b/mapHandler.h @@ -72,6 +72,7 @@ public: std::vector staticRiverDefs; std::map loadedDefs; //pointers to loaded defs (key is filename, uppercase) + std::map villages, forts, capitols; PseudoV< PseudoV< PseudoV > > hideBitmap; //specifies number of graphic that should be used to fully hide a tile @@ -91,6 +92,8 @@ public: bool recalculateHideVisPos(int3& pos); //recalculates position for hidden / visitable positions bool recalculateHideVisPosUnderObj(CGObjectInstance * obj, bool withBorder = false); //recalculates position for hidden / visitable positions under given object void init(); + std::pair pickObject(CGObjectInstance *obj); + void randomizeObject(CGObjectInstance *cur); void calculateBlockedPos(); void initObjectRects(); void borderAndTerrainBitmapInit();